我正在使用 Mac OS X,我已经尝试了内置版本openssl
以及最新版本openssl
,homebrew
但我仍然找不到绑定openssl s_server
到特定 IP 地址的方法,例如127.0.0.42
。
这一页说:
-accept val 用于侦听连接的可选 TCP 主机和端口。如果未指定,则使用 *:4433。
但它不起作用:
$ openssl s_server -accept '127.0.0.42:4433' -cert my.crt -key my.key
getservbyname failure for 127.0.0.42:4433
usage: s_server [args ...]
-accept arg - port to accept on (default is 4433)
-context arg - set session ID context
-verify arg - turn on peer certificate verification
-Verify arg - turn on peer certificate verification, must have a cert.
-cert arg - certificate file to use
(default is server.pem)
-crl_check - check the peer certificate has not been revoked by its CA.
The CRL(s) are appended to the certificate file
-crl_check_all - check the peer certificate has not been revoked by its CA
or any other CRL in the CA chain. CRL(s) are appended to the
the certificate file.
-certform arg - certificate format (PEM or DER) PEM default
-key arg - Private Key file to use, in cert file if
not specified (default is server.pem)
-keyform arg - key format (PEM, DER or ENGINE) PEM default
-pass arg - private key file pass phrase source
-dcert arg - second certificate file to use (usually for DSA)
-dcertform x - second certificate format (PEM or DER) PEM default
-dkey arg - second private key file to use (usually for DSA)
-dkeyform arg - second key format (PEM, DER or ENGINE) PEM default
-dpass arg - second private key file pass phrase source
-dhparam arg - DH parameter file to use, in cert file if not specified
or a default set of parameters is used
-named_curve arg - Elliptic curve name to use for ephemeral ECDH keys.
Use "openssl ecparam -list_curves" for all names
(default is nistp256).
-nbio - Run with non-blocking IO
-nbio_test - test with the non-blocking test bio
...
错误说-accept
只能指定端口,而不是IP地址,这太荒谬了。
这是怎么回事?有什么解决方法吗?
答案1
我很确定你不应该指定 IP 地址。你只想允许来自一个 IP 的连接吗?或者你为什么要指定它?
端口号应该足够了,要连接到你的服务器,请使用服务器的 IP 地址或 127.0.0.1(如果是本地的)。
这是选项的语法-accept
:
-accept port
- 监听连接的 TCP 端口。如果未指定,则使用 4433。
取自https://www.openssl.org/docs/man1.0.2/man1/openssl-s_server.html
答案2
你不需要为此编写自己的代码 - 使用隧道.stunnel 将为您完成所有加密工作并在另一端为您提供明文管道。
设置 launchd 之外的服务,当有人连接到所需端口时运行 stunnel。如果您愿意仔细阅读 launchd.plist 手册页来弄清楚这一点,可以告诉 launchd 监听所需的 IP 地址。或者,在进行测试时使用 shell 脚本启动服务。