无法在 Solaris 10 上获取本地颁发者证书
Posted
技术标签:
【中文标题】无法在 Solaris 10 上获取本地颁发者证书【英文标题】:Unable to get local issuer certificate on Solaris 10 【发布时间】:2016-06-17 23:03:53 【问题描述】:我在生产环境中运行 Solaris 10,并且我使用 ssl 与第三方 Web 服务集成,他们已为其提供了证书。直到几周前他们更新了证书和网络并为我们提供了新证书时,它才运行良好。我将这些证书添加到 Java 信任库 cacerts 和 jssecerts,但应用程序在握手时总是失败,因此我决定使用 Open SSL 对其进行调试。
当我尝试使用 OpenSSL 时,我不断收到错误消息“验证返回代码:20(无法获取本地颁发者证书)”。我在互联网上搜索并找到了几种解决方案,例如将证书复制到目录并为其提供 CApath 选项或将所有证书合并到一个文件中或仅提供带有 CAfile 的根证书。
我什至通过在其中复制证书(例如 etc/certs、etc/ssl/certs、etc/sfw/openssl/certs)来尝试不同的路径,并且我几乎尝试了从 .cert 到的所有证书类型。 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)
---
请建议我如何解决或解决此问题。
【问题讨论】:
网络服务是否真的使用客户端证书?您这样标记了您的问题,但没有提及您收到的证书类型。 是的,确实如此。一个是 Rootcertificate,名为:MGCROOTCA.cer,另外两个是 .er 格式 Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super User 或Unix & Linux Stack Exchange 会是一个更好的提问地方。另见Where do I post questions about Dev Ops?。 【参考方案1】:您缺少 通用名称 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
【讨论】:
得到 /usr/sfw/bin/openssl s_client -connect 主机名:443 -tls1 -servername 主机名 -CAfile MGCROOTCA.pem 未知选项 -servername 用法:s_client args 在将其更改为 openssl s_client -connect www.example.com:443 -tls1 -CAfile MGCROOTCA.pem 后可以,但现在我得到了:验证返回码:7(证书签名失败) "... 未知选项 -servername 用法:s_client args" - 听起来您使用的是真正旧版本的 OpenSSL。也许您应该在/usr/local/ssl
中安装库的更新版本,然后创建一个shell 脚本,将调用openssl
转发到/usr/local/ssl/bin/openssl
中找到的那个。例如,请参阅Where does mysql_ssl_rsa_setup get OpenSSL files?
如何更新库,能否提供一个脚本?【参考方案2】:
如果连接需要客户端证书,则需要使用-cert
参数告诉OpenSSL,如果您有单独的私钥(文件),则需要告诉-key
。 -CApath
仅用于服务器 证书。
【讨论】:
结果:root@orsapi2 # /usr/sfw/bin/openssl s_client -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:error:140AD002:SSL 例程:SSL_CTX_use_certificate_file:系统库:../../../../common/openssl/ssl/ssl_rsa.c:515: 我想MGCROOTCA.cer
是服务器根证书而不是客户端证书,对吧?并且您应该确保所有涉及的证书都是 PEM 格式(文本,以 -----BEGIN CERTIFICATE-----
行开头)。以上是关于无法在 Solaris 10 上获取本地颁发者证书的主要内容,如果未能解决你的问题,请参考以下文章