stunnel不会按预期validation客户端证书

我试图设置stunnel来提供一个TLS包装到HTTP本地支持TLS的服务。 没有使用TLS客户端证书,我可以很好地工作。

添加客户端证书configuration时:

 CAfile = /path/to/trusted.crt verify = 4 

我似乎无法连接使用openssl s_client 。 (请注意,我有点作弊 – 使用我的TLS服务器的证书作为客户端证书,但证书说,它有一个X509v3 Extended Key Usage: TLS Web Client Authentication, TLS Web Server Authentication ,所以我图它应该工作。)

 $ openssl s_client -state -connect [my-host-name]:[port] -cert [my-host-name].crt -key [my-host-name].key-nopass CONNECTED(00000003) SSL_connect:before/connect initialization SSL_connect:SSLv2/v3 write client hello A SSL_connect:SSLv3 read server hello A depth=2 C = IL, O = StartCom Ltd., OU = Secure Digital Certificate Signing, CN = StartCom Certification Authority verify return:1 depth=1 C = IL, O = StartCom Ltd., OU = StartCom Certification Authority, CN = StartCom Class 1 DV Server CA verify return:1 depth=0 CN = [my-hostname] verify return:1 SSL_connect:SSLv3 read server certificate A SSL_connect:SSLv3 read server key exchange A SSL_connect:SSLv3 read server certificate request A SSL_connect:SSLv3 read server done A SSL_connect:SSLv3 write client certificate A SSL_connect:SSLv3 write client key exchange A SSL_connect:SSLv3 write certificate verify A SSL_connect:SSLv3 write change cipher spec A SSL_connect:SSLv3 write finished A SSL_connect:SSLv3 flush data SSL3 alert read:fatal:unknown CA SSL_connect:failed in SSLv3 read server session ticket A 140391435724640:error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca:s3_pkt.c:1293:SSL alert number 48 140391435724640:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:184: --- Certificate chain 0 s:/CN=[my-host-name] i:/C=IL/O=StartCom Ltd./OU=StartCom Certification Authority/CN=StartCom Class 1 DV Server CA 1 s:/C=IL/O=StartCom Ltd./OU=StartCom Certification Authority/CN=StartCom Class 1 DV Server CA i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority 2 s:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority --- Server certificate -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- subject=/CN=[my-host-name] issuer=/C=IL/O=StartCom Ltd./OU=StartCom Certification Authority/CN=StartCom Class 1 DV Server CA --- Acceptable client certificate CA names /C=[the actual client cert I'd like to use] /CN=[my-host-name] (for testing) Server Temp Key: ECDH, prime256v1, 256 bits --- SSL handshake has read 5620 bytes and written 1937 bytes --- New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA Server public key is 3072 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE SSL-Session: Protocol : TLSv1 Cipher : ECDHE-RSA-AES256-SHA Session-ID: Session-ID-ctx: Master-Key: [...] Key-Arg : None Krb5 Principal: None PSK identity: None PSK identity hint: None Start Time: 1465393332 Timeout : 300 (sec) Verify return code: 0 (ok) --- 

(此时连接已closures。)

如果我在stunnelconfiguration中设置verify = 0 ,连接成功,我可以提出请求。 如果我在通道configuration中设置了verify = 1 ,那么如果我提供客户端证书,则连接将被丢弃,但如果我不提供,则会被接受。

所以它看起来像证书本身有问题(对于testing,它是用于TLS服务器的相同的证书,所以我不认为有什么问题)或我的configuration如何validation证书。

我想只validation实际出现在我的trusted.crts文件中的证书。 这些debugging行让我相信我已经正确地指定了证书(这是从客户端输出的):

 Acceptable client certificate CA names /C=[the actual client cert I'd like to use] /CN=[my-host-name] (for testing) 

由于我的testing证书出现在该列表中,我认为它应该是可以接受的。

我不知道我错过了什么。

/var/log/securestunnel正在logging这个:

 Jun 8 13:58:59 ip-10-0-0-176 stunnel: LOG5[17497:139964729063168]: Service [mysvc] accepted connection from 52.203.5.20:57224 Jun 8 13:58:59 ip-10-0-0-176 stunnel: LOG4[17497:139964729063168]: CERT: Verification error: unable to get local issuer certificate Jun 8 13:58:59 ip-10-0-0-176 stunnel: LOG4[17497:139964729063168]: Certificate check failed: depth=0, /CN=[my-host-name] Jun 8 13:58:59 ip-10-0-0-176 stunnel: LOG3[17497:139964729063168]: SSL_accept: 140890B2: error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned Jun 8 13:58:59 ip-10-0-0-176 stunnel: LOG5[17497:139964729063168]: Connection reset: 0 byte(s) sent to SSL, 0 byte(s) sent to socket 

它看起来像stunnel正在尝试validation证书对CA,而不是直接相信我的trusted.crts文件中的证书。

有什么build议么?

UPDATE

如果我在stunnelconfiguration文件中保留verify = 4 ,但将客户端证书的父证书(StartCom中的证书)放入trusted.crts文件中,则可以使用我的testing证书进行连接。 如果我在trusted.crts文件中更改为使用verify = 3与testing证书和其签署者,我再次无法连接。

有什么方法可以给我留下客户愿意接受的确切证书吗? 文档build议使用verify = 3或者verify = 4是这样做的方法,但是我似乎无法以我认为我应该能够实现的方式工作。