![为什么不能在自定义 Apache 安装中使用通过服务器管理导入的 SSL 证书?](https://linux22.com/image/581128/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E8%83%BD%E5%9C%A8%E8%87%AA%E5%AE%9A%E4%B9%89%20Apache%20%E5%AE%89%E8%A3%85%E4%B8%AD%E4%BD%BF%E7%94%A8%E9%80%9A%E8%BF%87%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AE%A1%E7%90%86%E5%AF%BC%E5%85%A5%E7%9A%84%20SSL%20%E8%AF%81%E4%B9%A6%EF%BC%9F.png)
我有几个 Mac OS X 10.6.8 Server Web 服务器,它们运行使用 MacPorts 安装的自定义 AMP255(Apache 2.x、MySQL 5.x 和 PHP 5.x)堆栈。我们有很多 Mac OS X Server 服务器,通常通过 Server Admin 安装 SSL 证书,它们在内置服务中“正常工作”,但是,这些 Web 服务器的 SSL 证书始终安装在非标准位置,并且仅用于 Apache。
长话短说,我们正尝试标准化这部分管理并通过服务器管理安装证书,但遇到了以下问题:当证书通过服务器管理安装并在我们的 Apache conf 文件中引用时,Apache 会在尝试启动时提示输入密码。这似乎不是我们知道的任何密码,肯定不是管理员或钥匙串密码!我们已将用户添加到_www
(certusers
主要是为了确保他们有权访问 中的私钥/etc/certificates/
)。
因此,通过自定义安装的证书,我们拥有以下文件(基本上只是从我们购买证书的公司粘贴过来的):
-rw-r--r-- 1 root admin 1395 Apr 10 11:22 *.domain.tld.ca
-rw-r--r-- 1 root admin 1656 Apr 10 11:21 *.domain.tld.cert
-rw-r--r-- 1 root admin 1680 Apr 10 11:22 *.domain.tld.key
并且以下内容VirtualHost
在/opt/local/apache2/conf/extra/httpd-ssl.conf
:
SSLCertificateFile /path/to/certs/*.domain.tld.cert
SSLCertificateKeyFile /path/to/certs/*.domain.tld.key
SSLCACertificateFile /path/to/certs/*.domain.tld.ca
此设置可正常运行。
如果我们使用通过服务器管理员安装的证书,服务器管理员和钥匙串助手都显示该证书有效,则它们的安装方式/etc/certificates/
如下:
-rw-r--r-- 1 root wheel 1655 Apr 9 13:44 *.domain.tld.SOMELONGHASH.cert.pem
-rw-r--r-- 1 root wheel 4266 Apr 9 13:44 *.domain.tld.SOMELONGHASH.chain.pem
-rw-r----- 1 root certusers 3406 Apr 9 13:44 *.domain.tld.SOMELONGHASH.concat.pem
-rw-r----- 1 root certusers 1751 Apr 9 13:44 *.domain.tld.SOMELONGHASH.key.pem
如果我们用httpd-ssl.conf
以下内容替换上述几行:
SSLCertificateFile /etc/certificates/*.domain.tld.SOMELONGHASH.cert.pem
SSLCertificateKeyFile /etc/certificates/*.domain.tld.SOMELONGHASH.key.pem
SSLCertificateChainFile /etc/certificates/*.domain.tld.SOMELONGHASH.chain.pem
这将提示输入未知密码。我也尝试过httpd-ssl.conf
如下配置:
SSLCertificateFile /etc/certificates/*.domain.tld.SOMELONGHASH.cert.pem
SSLCertificateKeyFile /etc/certificates/*.domain.tld.SOMELONGHASH.key.pem
SSLCertificateChainFile /etc/certificates/*.domain.tld.SOMELONGHASH.concat.pem
并作为:
SSLCertificateFile /etc/certificates/*.domain.tld.SOMELONGHASH.cert.pem
SSLCertificateKeyFile /etc/certificates/*.domain.tld.SOMELONGHASH.key.pem
SSLCACertificateFile /etc/certificates/*.domain.tld.SOMELONGHASH.chain.pem
我们已验证证书已配置为允许所有应用程序访问它(在 Keychain Assistant 中)。/etc/certificates/*.domain.tld.SOMELONGHASH.key.pem
&*.domain.tld.key
文件的差异显示前者已加密而后者未加密,因此我们假设服务器管理员/Keychain Assistant 出于某种原因对它们进行了加密。
我知道我可以按如下方式创建未加密的密钥文件:
sudo openssl rsa -in /etc/certificates/*.domain.tld.SOMELONGHASH.key.pem -out /etc/certificates/*.domain.tld.SOMELONGHASH.key.no_password.pem
但是,如果不输入密码,我就无法做到这一点。我想也许我可以从 Keychain Admin 导出密钥的未加密副本,但我没有看到这样的选项(更不用说.pem
所有导出选项中的选项都是灰色的)。
任何帮助都将不胜感激。
答案1
将证书导出为.p12
。记录使用的密码。
从文件中提取公钥.p12
- 它将提示输入刚刚在导出时设置的密码。
openssl pkcs12 -in /path/to/exported/cert.p12 -out /etc/certificates/new.pem -nokeys
检查输出文件中现在有多少证书;您可以在任何文本编辑器中打开它 - 它可能只是主题证书,也可能包含整个链(.ca
您的 CA 给您的文件中的证书)。如果它有整个链,那就没问题 - Apache 会毫无问题地接受同一文件中的整个内容。如果没有,请继续使用他们给您的链文件。
然后,我们也来拉取私钥:
openssl pkcs12 -in /path/to/exported/cert.p12 -out /etc/certificates/new.key -nocerts -nodes
请注意,该-nodes
标志指示命令不对私钥使用加密;这将阻止 Apache 提示输入密码。
将 Apache 指向这些新文件,然后重新启动。一切就绪!
答案2
正如 Shane 在评论中暗示的那样,人们可以.p12
从 Keychain Access 将证书导出为 PKCS#12 ( ) 文件(有或没有密码,当然,用密码保护这一步更安全)。为此,您必须首先以 root 用户身份启动 Keychain Access,因此sudo /Applications/Utilities/Keychain\ Access.app/Contents/MacOS/Keychain\ Access &
。从那里,我可以运行以下命令从导出的.p12
文件中提取私钥(不加密),并将其与 中的加密密钥放在一起/etc/certificates/
:
sudo openssl pkcs12 -in *.domain.tld.p12 -out /etc/certificates/*.domain.tld.SOMELONGHASH.key.no_password.pem -nodes -nocerts
sudo chown root:certusers /etc/certificates/*.domain.tld.SOMELONGHASH.key.no_password.pem
sudo chmod 640 /etc/certificates/*.domain.tld.SOMELONGHASH.key.no_password.pem
因此我现在有以下文件/etc/certificates/
:
-rw-r--r-- 1 root wheel 1655 Apr 9 13:44 *.domain.tld.SOMELONGHASH.cert.pem
-rw-r--r-- 1 root wheel 4266 Apr 9 13:44 *.domain.tld.SOMELONGHASH.chain.pem
-rw-r----- 1 root certusers 3406 Apr 9 13:44 *.domain.tld.SOMELONGHASH.concat.pem
-rw-r----- 1 root certusers 1867 Apr 11 08:30 *.domain.tld.SOMELONGHASH.key.no_password.pem
-rw-r----- 1 root certusers 1751 Apr 9 13:44 *.domain.tld.SOMELONGHASH.key.pem
我将httpd-ssl.conf
文件更新为:
SSLCertificateFile /etc/certificates/*.domain.tld.SOMELONGHASH.cert.pem
SSLCertificateKeyFile /etc/certificates/*.domain.tld.SOMELONGHASH.key.no_password.pem
SSLCertificateChainFile /etc/certificates/*.domain.tld.SOMELONGHASH.chain.pem
重新启动 Apache 并且它运行正常。
我在最初的问题中已经略过了这部分内容,但为了确保将用户_www
添加到certusers
组中(这是 Apache 读取私钥所必需的,因为我保留了这些权限),我使用了以下命令:
sudo dseditgroup -o edit -a _www -t user certusers