如何创build一个内部使用的不带自签名的CA的内部SSL证书?

我最终试图获得一个PHP CAS客户端(带有Apache的zend服务器8)来信任一个CAS服务器(tomcat 7),为此我已经尽了自己的私钥基础设施,在这里看到了密码取而代之的是臀部:

PKI GEN

#root key openssl genrsa -out rootCA.key -aes256 -passout pass:butts 4096 openssl req -x509 -new -key rootCA.key -out rootCA.crt -subj '/C=US/O=World Domination/CN=WorldDom Root CA' -days 3650 -sha256 -passin pass:butts #intermdiate key openssl genrsa -out intermediateCA.key -aes256 -passout pass:butts 4096 openssl req -new -key intermediateCA.key -out intermediateCA.csr -subj '/C=US/O=<orgname>/CN=<orgname> Intermediate CA' -passin pass:butts #X509V3 extension config file cat <<EOF > v3_ca.ext subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer:always basicConstraints=CA:true EOF #sign intermediate with root key & X509V3 extensions openssl x509 -req -in intermediateCA.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -CAserial rootCA.srl -extfile v3_ca.ext -out intermediateCA.crt -days 365 -sha256 -passin pass:butts #works at this stage openssl verify -CAfile rootCA.crt intermediateCA.crt openssl x509 -in intermediateCA.crt -text #server openssl genrsa -out server.key -aes256 -passout pass:butts 4096 openssl req -new -key server.key -out server.csr -subj '/C=US/O=<orgDiv>/CN=CASsrv' -passin pass:butts openssl x509 -req -in server.csr -CA intermediateCA.crt -CAkey intermediateCA.key -CAcreateserial -CAserial intermediateCA.srl -out server.crt -days 365 -sha256 -passin pass:butts #decrypt for web server use mv server.key server.key.secure openssl rsa -in server.key.secure -out server.key -passin pass:butts #client openssl genrsa -out client.key -aes256 -passout pass:butts 4096 openssl req -new -key client.key -out client.csr -subj '/C=US/O=<orgSubDiv>/CN=ZServer/[email protected]' -passin pass:butts openssl x509 -req -in client.csr -CA intermediateCA.crt -CAkey intermediateCA.key -CAcreateserial -CAserial intermediateCA.srl -out client.crt -days 365 -sha256 -passin pass:butts cat intermediateCA.crt rootCA.crt > CAchain.pem openssl pkcs12 -export -passout pass:butts -in client.crt -inkey client.key -certfile CAchain.pem -out client.p12 -passin pass:butts #works here too openssl verify -CAfile CAchain.pem server.crt (or client.crt) openssl x509 -in server.crt -text 

现在可以在Apache HTTP Server中使用CAchain.pem,server.crt和server.key文件,例如启用HTTPS。 rootCA.crt证书应该被导入到浏览器或邮件客户端的可信权限。

表面上,rootCA.crt证书应该被导入到浏览器或邮件客户端的信任机构。 这也是一个奇怪的旅程:

rootCA导入

 sudo cp rootCA.crt /etc/ssl/certs/worldDomCA.crt #symlink named after its hash.4, hash result is same after rename so I used the local version rather than the renamed etc/ssl version sudo ln -s /etc/ssl/certs/worldDomCA.crt /etc/ssl/certs/'openssl x509 -hash -noout -in rootCA.crt'.4 #this just hangs, disturbingly openssl verify -CApath /etc/ssl/certs/worldDomCA.crt 

无可否认,我不确定哪里放CAchain和服务器证书文件,但更值得注意的是s_client抱怨证书仍然自签名,而不是像挂钩validation。 从主题和发行人的路线来看

 subject=/C=US/ST=test/L=test/O=test/OU=test/CN=servername.domain.int issuer=/C=US/ST=test/L=test/O=test/OU=test/CN=servername.domain.int 

证书包括他们伪造的盒子的DN。 如果我在另一个盒子上做了我的CA,然后把它拿来用来签署我的服务器/客户端证书,我可以逃脱吗? 值得注意的是,两台服务器都运行在同一个盒子上,因为这整个混乱仍在探索评估。

为了validation你的链,你需要将信任锚添加到OpenSSL的列表中。 这包括将您的根CA证书放在已知位置并运行update-ca-trust命令。

在我的Fedora系统上,目录是/etc/pki/ca-trust/source/anchors 。 运行update-ca-trust将证书附加到/etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt 。 不同的发行版使用不同的path,因此可能需要一些研究。

要validationpath运行:

 $ openssl verify -CApath /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt -untrusted intermediateCA.crt server.crt server.crt: OK 

同样,在你的机器上-CApath的path可能不同。


openssl s_client将证书作为SSL / TLS客户端进行检查。 因此,您将其指向远程服务器URL。 在此之前,您需要在该远程计算机上同时安装从属CA证书和最终实体(服务器)证书和私钥。 这个过程当然取决于你在远程服务器上使用的应用程序。 例如,使用apache将文件放置在合理的位置,并在您的站点configuration中指向它们:

 SSLEngine on SSLCertificateFile /etc/pki/tls/certs/server.crt SSLCertificateKeyFile /etc/pki/tls/private/server.key SSLCertificateChainFile /etc/pki/tls/certs/world-domination.ca-bundle 

(请注意, SSLCertificateChainFile已从版本2.4.8开始弃用)

你似乎有输出build议在远程机器上当前安装的证书是安装时生成的自签名证书。

韦尔普“原来的答案是”是的,但没有必要“。 大部分的PKI生成都很好,但并不是所有这些文件实际上都被使用 – CAchain文件并不是真正需要的,除了validation之外,opensslvalidation只需要两个参数,不需要客户端文件, srl文件是副产品。 问题在于发行的CN与请求的CN匹配,因为客户通过域检查证书。

为了让Tomcat提供PKI证书而不是自签证书,很多指南build议启动并运行HTTPS,还有两个额外的步骤:

转换为pkcs12

 openssl pkcs12 -export -chain -passout pass:butts -in server.crt -inkey server.key -out server.p12 -name alias -CAfile (intermediateCA.crt or CAchain.crt) -caname steeve 

然后导入Tomcat的JKS密钥库

…确保新条目与tomcat的configuration正在查找的内容相匹配,并首先更改原始的别名

 keytool -changealias -alias tomcat -destalias derpcat -storepass changeit keytool -importkeystore -deststorepass changeit -destkeypass changeit -destkeystore server.keystore -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass butts -alias tomcat 

storepass和keypass必须匹配才能正常工作。

s_client仍然在根CA上自签名,根CA需要由客户端安装(我不能责怪他们不信任“World Domination”),但CASredirectSSO现在可以无缝运行。