为什么不能在自定义 Apache 安装中使用通过服务器管理导入的 SSL 证书?

为什么不能在自定义 Apache 安装中使用通过服务器管理导入的 SSL 证书?

我有几个 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 会在尝试启动时提示输入密码。这似乎不是我们知道的任何密码,肯定不是管理员或钥匙串密码!我们已将用户添加到_wwwcertusers主要是为了确保他们有权访问 中的私钥/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

相关内容