我正在尝试设置一个脚本来生成用于 IIS 的 SSL 证书。我正在尝试让自签名 CA 证书签名的证书工作。我已经完成了 99%,但仍然有些问题。这是为了与 MSExchange SSL 证书一起使用。我希望拥有长期有效的自签名证书,并拥有一个可以安装在智能手机等设备上的根证书,这将允许我信任我用它签名的其他证书,如 SSL 证书。
这就是我正在做的事情:
/// create a private root cert
openssl genrsa -des3 -out work\Private-CA.key 2048
openssl req -new -x509 -days 3650
-key work\Private-CA.key
-out work\Public-CA.CRT
/// Create an SSL cert request
openssl genrsa -des3 -out work\Certificate-Request.key 2048
openssl req -new
-key work\Certificate-Request.key
-out work\SigningRequest.csr
/// Sign the request with the root cert
openssl x509 -req -days 3650 -extensions v3_req
-in work\SigningRequest.csr
-CA work\Public-CA.CRT
-CAkey work\Private-CA.key
-CAcreateserial
-out work\SSL-Cert-signed-by-Public-CA.CRT
前 4 个命令似乎没问题。最后一条命令是生成具有我想要的属性的证书。
我将 Public-CA.CRT 作为受信任的根证书导入计算机存储。然后我使用 exchange import-exchangecertifiate cmdlet 尝试导入 SSL-Cert-signed-by-Public-CA.CRT。此操作失败,并显示一条消息,提示证书不受信任。
看起来它没有被签名。如果我将 SSL 证书导入到机器个人存储中,它还表明它没有认证路线。
有谁对此有更好的了解,能看到我遗漏了什么吗?
另外:有没有办法从命令行询问 openssl 证书 X 是否已由证书 Y 签名?这应该可行,但实际上不行:
openssl verify -cafile Public-CA.CRT SSL-Cert-signed-by-Public-CA.CRT
usage: verify [-verbose] [-CApath path] [-CAfile file] [-purpose purpose] [-crl_check] [-engine e] cert1 cert2 ...
recognized usages:
sslclient SSL client
sslserver SSL server
nssslserver Netscape SSL server
smimesign S/MIME signing
smimeencrypt S/MIME encryption
crlsign CRL signing
any Any Purpose
ocsphelper OCSP helper
添加 -purpose 并没有使事情变得更好。
答案1
您应该将 CA 的公钥(而不是私钥)导入受信任的根存储区 - 私钥永远不会离开您的 CA。
信任 CA 的公钥,然后 Exchange 应该可以毫无问题地导入新生成的证书。不过,听起来你只给了它公钥而不是文件Certificate-Request.key
?
我建议从 Exchange 服务器上的 Microsoft 工具生成证书签名请求,然后在 CA 上对其进行签名 - 或者如果您不这样做,至少将密钥和证书对打包在 PKCS12 文件中以提供给 Exchange cmdlet,因为它看起来像是它想要用于任何私钥导入的格式:
openssl pkcs12 -export -out work\Exchange-Cert-Package.pfx -in work\SSL-Cert-signed-by-Public-CA.CRT -inkey work\Certificate-Request.key