From: Michael Haas <haas@computerlinguist.org> * init script no longer creates certificates (consider client mode as use case) * patches/010_fix_getnameinfo.patch: Fix getnameinfo signature * patches/011_disable_ssp_linking.patch: Disable -fstack-protector as it is not always available in OpenWRT * old patches (in oldpackages) no longer necessary * remove libwrap dependency * remove libpthread dependency * respect CONFIG_IPV6 * init script uses procd * sample stunnel.conf runs in client mode - prevents start failure, does not require cert Possible enhancement: automatically generate certificate as done in uhttpd. However, as client mode is a possible use case, I'd rather not. Additionally, stunnel may use several certs with user-defined locations and we can't easily set a cert location via command-line args. The package is based on https://sites.google.com/site/twisteroidambassador/openwrt/stunnel Signed-off-by: Michael Haas <haas@computerlinguist.org>lilik-openwrt-22.03
@ -0,0 +1,77 @@ | |||||
# | |||||
# Copyright (C) 2006-2014 OpenWrt.org | |||||
# | |||||
# This is free software, licensed under the GNU General Public License v2. | |||||
# See /LICENSE for more information. | |||||
# | |||||
include $(TOPDIR)/rules.mk | |||||
PKG_NAME:=stunnel | |||||
PKG_VERSION:=5.10 | |||||
PKG_RELEASE:=1 | |||||
PKG_LICENSE:=GPL-2.0+ | |||||
PKG_MAINTAINER:=Michael Haas <haas@computerlinguist.org> | |||||
PKG_LICENSE_FILES:=COPYING COPYRIGHT.GPL | |||||
PKG_SOURCE_URL:=http://stunnel.cybermirror.org/archive/5.x/ | |||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz | |||||
PKG_MD5SUM:=a0edda805eb7d6ea600a230fb0979ea1 | |||||
PKG_FIXUP:=autoreconf | |||||
PKG_INSTALL:=1 | |||||
include $(INCLUDE_DIR)/package.mk | |||||
define Package/stunnel | |||||
SECTION:=net | |||||
CATEGORY:=Network | |||||
DEPENDS:=+libopenssl | |||||
TITLE:=SSL TCP Wrapper | |||||
URL:=http://www.stunnel.org/ | |||||
endef | |||||
define Package/stunnel/description | |||||
Stunnel is a program that allows you to encrypt arbitrary TCP | |||||
connections inside SSL (Secure Sockets Layer) available on both Unix | |||||
and Windows. Stunnel can allow you to secure non-SSL aware daemons and | |||||
protocols (like POP, IMAP, LDAP, etc) by having Stunnel provide the | |||||
encryption, requiring no changes to the daemon's code. | |||||
endef | |||||
define Package/stunnel/conffiles | |||||
/etc/stunnel/stunnel.conf | |||||
endef | |||||
CONFIGURE_ARGS+= \ | |||||
--with-random=/dev/urandom \ | |||||
--with-threads=fork \ | |||||
--with-ssl=$(STAGING_DIR)/usr \ | |||||
--disable-libwrap \ | |||||
--disable-systemd | |||||
ifeq ($(CONFIG_IPV6),n) | |||||
CONFIGURE_ARGS+= \ | |||||
--disable-ipv6 | |||||
endif | |||||
define Build/Compile | |||||
mkdir -p $(PKG_INSTALL_DIR)/etc/stunnel | |||||
echo '#dummy' > $(PKG_INSTALL_DIR)/etc/stunnel/stunnel.pem | |||||
$(call Build/Compile/Default) | |||||
endef | |||||
define Package/stunnel/install | |||||
$(INSTALL_DIR) $(1)/usr/bin | |||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/stunnel $(1)/usr/bin/ | |||||
$(INSTALL_DIR) $(1)/usr/lib/stunnel | |||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/stunnel/libstunnel.so $(1)/usr/lib/stunnel/ | |||||
$(INSTALL_DIR) $(1)/etc/stunnel | |||||
$(INSTALL_CONF) ./files/stunnel.conf $(1)/etc/stunnel/stunnel.conf | |||||
$(INSTALL_DIR) $(1)/etc/init.d | |||||
$(INSTALL_BIN) ./files/stunnel.init $(1)/etc/init.d/stunnel | |||||
endef | |||||
$(eval $(call BuildPackage,stunnel)) |
@ -0,0 +1,45 @@ | |||||
; Drop privileges | |||||
setuid = nobody | |||||
setgid = nogroup | |||||
; When running under procd, stay in foreground | |||||
foreground = yes | |||||
; Don't log to stderr, use syslog | |||||
syslog = yes | |||||
; 1-7. Use 7 for greatest verbosity | |||||
;debug = 5 | |||||
; Starting here, enter your services or uncomment the examples | |||||
; Example: | |||||
; If your local httpd does not support HTTPS, use stunnel in remote | |||||
; mode to forward TLS connections coming in on port 443 to non-TLS | |||||
; on port 80. | |||||
; Make sure that the cert is available. | |||||
;[httpd] | |||||
;accept = 443 | |||||
;connect = 127.0.0.1:80 | |||||
;cert = /etc/stunnel/stunnel.pem | |||||
; Example: | |||||
; If your local email client does not support TLS, | |||||
; use stunnel in client mode to forward non-TLS connections on | |||||
; port 143 to TLS-enabled servername:993. | |||||
;[imap] | |||||
;client = yes | |||||
;accept = 143 | |||||
;connect = servername:993 | |||||
; Disable peer verification - be sure to understand the limitations of peer | |||||
; verification in stunnel when enabling. | |||||
;verify = 0 | |||||
; Default client section: | |||||
; stunnel requires at least one section to start successfully. | |||||
; You can safely remove this section once you have configured | |||||
; your own. We use client mode here as server requires a certificate. | |||||
[dummy] | |||||
client = yes | |||||
accept = localhost:6000 | |||||
connect = localhost:6001 |
@ -0,0 +1,12 @@ | |||||
#!/bin/sh /etc/rc.common | |||||
# Copyright (C) 2006-2008 OpenWrt.org | |||||
START=90 | |||||
USE_PROCD=1 | |||||
start_service() { | |||||
procd_open_instance | |||||
procd_set_param command /usr/bin/stunnel /etc/stunnel/stunnel.conf | |||||
procd_set_param respawn # respawn automatically if something died | |||||
procd_close_instance | |||||
} |
@ -0,0 +1,25 @@ | |||||
--- a/src/prototypes.h | |||||
+++ b/src/prototypes.h | |||||
@@ -559,7 +559,7 @@ extern GETNAMEINFO s_getnameinfo; | |||||
#endif /* USE_WIN32 */ | |||||
-int getnameinfo(const struct sockaddr *, int, char *, int, char *, int, int); | |||||
+int getnameinfo(const struct sockaddr *, socklen_t, char *, socklen_t, char *, socklen_t, unsigned int); | |||||
#endif /* !defined HAVE_GETNAMEINFO */ | |||||
--- a/src/resolver.c | |||||
+++ b/src/resolver.c | |||||
@@ -535,8 +535,9 @@ const char *s_gai_strerror(int err) { | |||||
/* implementation is limited to functionality needed by stunnel */ | |||||
#ifndef HAVE_GETNAMEINFO | |||||
-int getnameinfo(const struct sockaddr *sa, int salen, | |||||
- char *host, int hostlen, char *serv, int servlen, int flags) { | |||||
+int getnameinfo(const struct sockaddr *sa, socklen_t salen, | |||||
+ char *host, socklen_t hostlen, char *serv, socklen_t servlen, | |||||
+ unsigned int flags) { | |||||
#if defined(USE_WIN32) && !defined(_WIN32_WCE) | |||||
if(s_getnameinfo) |
@ -0,0 +1,140 @@ | |||||
--- a/configure | |||||
+++ b/configure | |||||
@@ -5646,66 +5646,66 @@ done | |||||
-for flag in -fstack-protector; do | |||||
- as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh` | |||||
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 | |||||
-$as_echo_n "checking whether C compiler accepts $flag... " >&6; } | |||||
-if eval \${$as_CACHEVAR+:} false; then : | |||||
- $as_echo_n "(cached) " >&6 | |||||
-else | |||||
- | |||||
- ax_check_save_flags=$CFLAGS | |||||
- CFLAGS="$CFLAGS $flag" | |||||
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |||||
-/* end confdefs.h. */ | |||||
- | |||||
-int | |||||
-main () | |||||
-{ | |||||
- | |||||
- ; | |||||
- return 0; | |||||
-} | |||||
-_ACEOF | |||||
-if ac_fn_c_try_compile "$LINENO"; then : | |||||
- eval "$as_CACHEVAR=yes" | |||||
-else | |||||
- eval "$as_CACHEVAR=no" | |||||
-fi | |||||
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext | |||||
- CFLAGS=$ax_check_save_flags | |||||
-fi | |||||
-eval ac_res=\$$as_CACHEVAR | |||||
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 | |||||
-$as_echo "$ac_res" >&6; } | |||||
-if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then : | |||||
- if ${CFLAGS+:} false; then : | |||||
- case " $CFLAGS " in | |||||
- *" $flag "*) | |||||
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$flag"; } >&5 | |||||
- (: CFLAGS already contains $flag) 2>&5 | |||||
- ac_status=$? | |||||
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 | |||||
- test $ac_status = 0; } | |||||
- ;; | |||||
- *) | |||||
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$flag\""; } >&5 | |||||
- (: CFLAGS="$CFLAGS $flag") 2>&5 | |||||
- ac_status=$? | |||||
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 | |||||
- test $ac_status = 0; } | |||||
- CFLAGS="$CFLAGS $flag" | |||||
- ;; | |||||
- esac | |||||
-else | |||||
- CFLAGS="$flag" | |||||
-fi | |||||
- | |||||
-else | |||||
- : | |||||
-fi | |||||
- | |||||
-done | |||||
+#for flag in -fstack-protector; do | |||||
+# as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh` | |||||
+#{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 | |||||
+#$as_echo_n "checking whether C compiler accepts $flag... " >&6; } | |||||
+#if eval \${$as_CACHEVAR+:} false; then : | |||||
+# $as_echo_n "(cached) " >&6 | |||||
+#else | |||||
+# | |||||
+# ax_check_save_flags=$CFLAGS | |||||
+# CFLAGS="$CFLAGS $flag" | |||||
+# cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |||||
+#/* end confdefs.h. */ | |||||
+ | |||||
+#int | |||||
+#main () | |||||
+#{ | |||||
+# | |||||
+# ; | |||||
+# return 0; | |||||
+#} | |||||
+#_ACEOF | |||||
+#if ac_fn_c_try_compile "$LINENO"; then : | |||||
+# eval "$as_CACHEVAR=yes" | |||||
+#else | |||||
+# eval "$as_CACHEVAR=no" | |||||
+#fi | |||||
+#rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext | |||||
+# CFLAGS=$ax_check_save_flags | |||||
+#fi | |||||
+#eval ac_res=\$$as_CACHEVAR | |||||
+# { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 | |||||
+#$as_echo "$ac_res" >&6; } | |||||
+#if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then : | |||||
+# if ${CFLAGS+:} false; then : | |||||
+# case " $CFLAGS " in | |||||
+# *" $flag "*) | |||||
+# { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$flag"; } >&5 | |||||
+# (: CFLAGS already contains $flag) 2>&5 | |||||
+# ac_status=$? | |||||
+# $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 | |||||
+# test $ac_status = 0; } | |||||
+# ;; | |||||
+# *) | |||||
+# { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$flag\""; } >&5 | |||||
+# (: CFLAGS="$CFLAGS $flag") 2>&5 | |||||
+# ac_status=$? | |||||
+# $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 | |||||
+# test $ac_status = 0; } | |||||
+# CFLAGS="$CFLAGS $flag" | |||||
+# ;; | |||||
+# esac | |||||
+#else | |||||
+# CFLAGS="$flag" | |||||
+#fi | |||||
+# | |||||
+#else | |||||
+# : | |||||
+#fi | |||||
+# | |||||
+#done | |||||
--- a/configure.ac | |||||
+++ b/configure.ac | |||||
@@ -71,7 +71,7 @@ AX_APPEND_COMPILE_FLAGS([-Wformat=2]) | |||||
AX_APPEND_COMPILE_FLAGS([-Wconversion]) | |||||
AX_APPEND_COMPILE_FLAGS([-Wno-long-long]) | |||||
AX_APPEND_COMPILE_FLAGS([-Wno-deprecated-declarations]) | |||||
-AX_APPEND_COMPILE_FLAGS([-fstack-protector]) | |||||
+#AX_APPEND_COMPILE_FLAGS([-fstack-protector]) | |||||
AX_APPEND_COMPILE_FLAGS([-fPIE]) | |||||
AX_APPEND_COMPILE_FLAGS([-D_FORTIFY_SOURCE=2]) | |||||
AX_APPEND_LINK_FLAGS([-fPIE -pie]) |