无法在Solaris 10上获得本地发行者证书

问题描述:

我在生产环境中运行Solaris 10,并且我已经使用第三方Web服务与他们提供证书的ssl进行了集成。直到几周前,他们更新了证书和网络,并向我们提供了新证书,这一切都很顺利。我将这些证书添加到Java信任库cacerts和jssecerts,但应用程序始终因握手而失败,因此我决定使用Open SSL进行调试。无法在Solaris 10上获得本地发行者证书

当我尝试使用OpenSSL时,我不断收到错误“验证返回码:20(无法获得本地签发者证书)”。我在互联网上搜索并找到了一些解决方案,例如将证书复制到目录并为其提供CApath选项,或将所有证书合并到一个文件中,或者仅提供CAfile的根证书。

我甚至通过复制其中的证书,像etc/certs,etc/ssl/certs,etc/sfw/openssl/certs来尝试不同的路径,并且我对.cert中的所有证书tyes进行了大量试验。 pfx到.p7b,但我总是得到相同的错误。

示例如下共享:

/usr/sfw/bin/openssl s_client -CApath /etc/sfw/openssl/certs -connect example.hostipaddress:443 -debug 
CONNECTED(00000004) 
-- Long List of string removed to conserver space -- 
02ef - <SPACES/NULS> 
depth=1 /DC=local/DC=mgc/CN=MBTC-ENTCA1 
verify error:num=20:unable to get local issuer certificate 
verify return:0 

Certificate chain 
0 s:/C=PH/ST=Metro Manila/L=Makati City/O=Metropolitan Bank and Trust Company/OU=CID-ITSAD/CN=IOSG-XRSWEB 
    i:/DC=local/DC=mgc/CN=MBTC-ENTCA1 
1 s:/DC=local/DC=mgc/CN=MBTC-ENTCA1 
    i:/DC=local/DC=mgc/CN=MGCROOTCA 
--- 
Server certificate 
-----BEGIN CERTIFICATE----- 
MIIGmjCCBYKgAwIBAgITXgAAByoWADJYm5tc5AAEAAAHKjANBgkqhkiG9w0BAQsF 
ADBCMRUwEwYKCZImiZPyLGQBGRYFbG9jYWwxEzARBgoJkiaJk/IsZAEZFgNtZ2Mx 
FDASBgNVBAMTC01CVEMtRU5UQ0ExMB4XDTE2MDEyMzE2MTg0M1oXDTE4MDEyMjE2 
MTg0M1owgZIxCzAJBgNVBAYTAlBIMRUwEwYDVQQIEwxNZXRybyBNYW5pbGExFDAS 
BgNVBAcTC01ha2F0aSBDaXR5MSwwKgYDVQQKEyNNZXRyb3BvbGl0YW4gQmFuayBh 
bmQgVHJ1c3QgQ29tcGFueTESMBAGA1UECxMJQ0lELUlUU0FEMRQwEgYDVQQDEwtJ 
T1NHLVhSU1dFQjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM3QYlQu 
01dc/h1CekLCfzwx2LfDHZJgb/A6DwbMLlIN8mA/EH03DV6SAP/n+McBZ9Kg97a2 
zWsV3Thq9TxHx2GIrU0l3Jp0CyIC2uAWK5SzcBaLkOCks4zA/uwqNpYdVZ/wX6Yh 
iCN8OnEfKdlUCfyIT6T1P5bIWgRSH+FooYfqV4+YJyAUjF2cticoemQcOPWYNBki 
wgO938Lnyr7YfaQM2z8n4GjqPBuSJmtISb6LW0tzmBPRA5hBi0NpWN1IPjyTU8h8 
soWnu6LtfGZq/fmDQ2fvlvj2wbi4U2B6E9QhjnEDOI5vWo7f0Lxq+DXABORU+Eef 
Rk5pyoWxLfTfgq0CAwEAAaOCAzYwggMyMAsGA1UdDwQEAwIHgDBEBgkqhkiG9w0B 
CQ8ENzA1MA4GCCqGSIb3DQMCAgIAgDAOBggqhkiG9w0DBAICAIAwBwYFKw4DAgcw 
CgYIKoZIhvcNAwcwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHQYDVR0OBBYEFCAm6czc 
-----END CERTIFICATE----- 
subject=/C=PH/ST=Metro Manila/L=Makati City/O=Metropolitan Bank and Trust Company/OU=CID-ITSAD/CN=IOSG-XRSWEB 
issuer=/DC=local/DC=mgc/CN=MBTC-ENTCA1 
--- 
No client certificate CA names sent 
--- 
SSL handshake has read 3570 bytes and written 471 bytes 
--- 
New, TLSv1/SSLv3, Cipher is AES256-SHA 
Server public key is 2048 bit 
Secure Renegotiation IS supported 
SSL-Session: 
    Protocol : TLSv1 
    Cipher : AES256-SHA 
    Session-ID: 79070000B3B0F581DDC6F732F5BAD3F384CAE1D67ADBA4AF551393A6A208C897 
    Session-ID-ctx: 
    Master-Key: D04EFCA3E85CCB6E1F80F2B74C6CF24248B693F5CDABB0355F..... 
    Key-Arg : None 
    Start Time: 1457082099 
    Timeout : 300 (sec) 
    Verify return code: 20 (unable to get local issuer certificate) 
--- 

请建议我如何解决或解决此问题。

+0

Web服务实际上是使用客户端证书吗?您这样标记了您的问题,但不提及您收到的证书类型。 –

+0

是的,它的确如此。一个是Rootcertificate,命名为:MGCROOTCA.cer,另外两个是.er格式 –

+0

Stack Overflow是编程和开发问题的网站。这个问题似乎与题目无关,因为它不涉及编程或开发。请参阅帮助中心的[我可以询问哪些主题](http://*.com/help/on-topic)。也许[超级用户](http://superuser.com/)或[Unix&Linux堆栈交换](http://unix.stackexchange.com/)会是一个更好的地方。另请参阅[我在哪里发布有关Dev Ops的问题?](http://meta.stackexchange.com/q/134306)。 – jww

如果连接需要客户端证书,则需要使用-cert参数告知OpenSSL,如果您拥有单独的私钥(文件),则需要告知-key-CApath仅用于服务器证书。

+0

结果: 根@ orsapi2#在/ usr/sfw/bin中/ OpenSSL的的s_client.First -connect iosg-xrsweb:443 -cert /etc/ssl/MGCROOTCA.cer 无法从获得证书“/etc/ssl/MGCROOTCA.cer ' 5842:error:02001002:system library:fopen:No such file or directory:/on10/build-nd/G10U11B0B/usr/src/common/openssl/crypto/bio/bss_file.c:294:fopen('/ etc/ssl/MGCROOTCA.cer','r') 5842:error:20074002:BIO例程:FILE_CTRL:system lib:/ on10/build -nd/G10U11B0B/usr/src/common/openssl/crypto/bio/bss_file .c:296: 5842:错误:140AD002:SSL例程:SSL_CTX_use_certificate_file:系统库:../../../../ common/openssl/ssl/ssl_rsa.c:515: –

+0

我想'MGCROOTCA。 cer'是服务器根证书,而不是客户端证书,对吗?你应该确保涉及的所有证书都是PEM格式(文本,以'----- BEGIN CERTIFICATE -----'开始)。 –

您正在使用的MGCROOTCA一个通用名称缺少发行人CA:

/usr/sfw/bin/openssl s_client -CApath /etc/sfw/openssl/certs -connect example.hostipaddress:443 -debug 
CONNECTED(00000004) 
... 
depth=1 /DC=local/DC=mgc/CN=MBTC-ENTCA1 
verify error:num=20:unable to get local issuer certificate 
verify return:0 

Certificate chain 
0 s:/C=PH/ST=Metro Manila/L=Makati City/O=Metropolitan Bank and Trust Company/OU=CID-ITSAD/CN=IOSG-XRSWEB 
    i:/DC=local/DC=mgc/CN=MBTC-ENTCA1 
1 s:/DC=local/DC=mgc/CN=MBTC-ENTCA1 
    i:/DC=local/DC=mgc/CN=MGCROOTCA 
    ... 

我不能在网上找到它,所以你可能要联系银行为它。一旦你得到了它,确保它的PEM格式,然后:

$ openssl s_client -connect www.example.com:443 -tls1 \ 
    -servername www.example.com -CAfile MGCROOTCA.pem 
+0

了在/ usr/sfw/bin中/ OpenSSL的的s_client.First -connect主机名:443 -tls1 -servername主机名-CAfile MGCROOTCA.pem 未知选项-ServerName 用法的s_client.First ARGS –

+0

好改变它的OpenSSL的s_client.First -connect www.example后。 com:443 -tls1 -CAfile MGCROOTCA.pem工作,但现在我得到了: 验证返回码:7(证书签名失败) –

+0

*“...未知选项-servername用法:s_client args”* - 它听起来像你使用真正的旧版本的OpenSSL。也许你应该在'/ usr/local/ssl'中安装库的更新版本,然后创建一个shell脚本,将调用转发到'openssl'到'/ usr/local/ssl/bin/openssl'中。 。例如,请参见[mysql_ssl_rsa_setup获取OpenSSL文件的位置?](http://*.com/a/35834957/608639) – jww