我在2008上使用IIS 7生成用于IIS的自签名证书(基本上是单击按钮)。
但是,即使当我导出此证书并将其添加到windows客户端的curl bundle.crt中时,无论是它还是openssl.exe都不会正确地验证证书:
openssl s_client -CAfile curl-ca-bundle.crt -showcerts -connect myserver.ad.pri:443
CONNECTED(00000003)
depth=0 /CN=myserver.ad.pri
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 /CN=myserver.ad.pri
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
0 s:/CN=myserver.ad.pri
i:/CN=myserver.ad.pri
-----BEGIN CERTIFICATE-----
MIIDADCCAeigAwIBAgIQTi9gdBLdo6pJ1h4Zljr/wzANBgkqhkiG9w0BAQUFADAp
....
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=myserver.ad.pri
issuer=/CN=myserver.ad.pri
---
No client certificate CA names sent
---
SSL handshake has read 924 bytes and written 444 bytes
---
New, TLSv1/SSLv3, Cipher is AES128-SHA
Server public key is 2048 bit
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : AES128-SHA
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg : None
Start Time: 1377728216
Timeout : 300 (sec)
Verify return code: 21 (unable to verify the first certificate)
---
read:errno=104我使用IE将证书导出到Base-64编码,这是openssl可读的PEM: openssl x509 -inform PEM -in myserver.crt -text。
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
4e:2f:60:74:12:dd:a3:aa:49:d6:1e:19:96:3a:ff:c3
Signature Algorithm: sha1WithRSAEncryption
Issuer: CN=myserver.ad.pri
Validity
Not Before: Aug 26 15:38:46 2013 GMT
Not After : Aug 26 00:00:00 2014 GMT
Subject: CN=myserver.ad.pri
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
....
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Key Usage:
Key Encipherment, Data Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication
Signature Algorithm: sha1WithRSAEncryption
...
-----BEGIN CERTIFICATE-----
....具有相同curl bundle.crt的openssl/curl将验证来自google.com:443等的证书。
发布于 2017-02-09 20:40:30
我也遇到了这个问题(我很惊讶更多的人没有)。当我无法获得一个NodeJS HTTP(s)客户端连接到一个带有自签名证书的IIS实例时(一个是通过IIS管理器创建的),我就得到了可怕的‘无法验证第一个证书错误的’!
这似乎是因为IISManager为此目的创建的证书指定了一些“密钥使用”扩展;“密钥加密”和“数据加密”。
结果发现,当openssl遇到指定“密钥使用”但未能指定“certSign”使用的证书时,openssl代码会将该证书折扣为可能的CA证书,即使该证书已正确地提供给openssl代码(这意味着它无法根据所述缺席CA验证证书!)。
(参见这里的逻辑,purp.c#L503 )
解决方案就像上面提到的那样,就是用正确的密钥用法创建自己的证书(或者没有密钥使用扩展!)
我还认为,我应该包括一种创建自签名证书的替代方法,如果您在windows中,openssl客户端将对此感到满意。
首先从这里下载powershell脚本
在powershell控制台(管理)中,从包含下载脚本的文件夹中执行以下命令
New-SelfsignedCertificateEx -StoreLocation "LocalMachine" -KeyUsage "DigitalSignature,KeyEncipherment,KeyCertSign" -Subject "CN=<HOST_NAME_TO_USE>" -FriendlyName "<HOST_NAME_TO_USE>" -SignatureAlgorithm sha256 -SubjectAlternativeName "<HOST_NAME_TO_USE>","anotherhost.org","someotherdomain.com"执行上述命令后,LocalMachine\Personal证书存储区将包含IIS可用于其SSL通信的自签名证书。(请注意,您可能还需要将此证书复制到受信任的根存储区之一,以确保该证书在该计算机上是可信的)
发布于 2013-08-30 18:56:32
我通过使用OpenSSL创建一个自签名的CA证书来解决这个问题,然后创建了一个服务器证书请求(也是在openssl中,出于某种原因,openssl不喜欢签署由IIS生成的请求),用以前的CA证书对其签名,然后导出到PKCS12。然后导入IIS。一旦CA证书添加到curl bundle.crt中,它将正确地验证该链:
生成CA:
openssl req -new -x509 -days 3650 -extensions v3_ca \
-keyout cakey.pem -out cacert.pem -config /etc/ssl/openssl.cnf \
-newkey rsa:2048生成服务器密钥和签名请求:
openssl req -new -nodes -out server-csr.pem -keyout server-key.pem -newkey rsa:2048使用CA签署请求:
openssl ca -config /etc/ssl/openssl.cnf -cert cacert.pem -keyfile cakey.pem \
-out server-cert.pem -in server-csr.pem将服务器证书导出到PKCS#12:
openssl pkcs12 -export -out server-key-cert.pfx \
-inkey server-key.pem -in server-cert.pem -certfile cacert.pem将服务器-key-cert.pfx导入IIS。(Re)将站点绑定的SSL绑定绑定到证书。
将cacert.pem附加到客户的curl bundle.crt中。openssl s_client -showcerts -CAfile curl bundle.crt -connect服务器:443具有深度0和1,并将验证返回。
Notes:确保keyUsage = nonRepudiation、digitalSignature、keyEncipherment在openssl.cnf Notes请求中的usr_cert部分下启用,不会包含这些keyUsage,并且IIS会抱怨绑定。
https://stackoverflow.com/questions/18499636
复制相似问题