Ssl

無法使 httpd 使用正確的 SSL

  • November 20, 2015

我有一個簽名的 CA,由我的大學簽發。我使用他們的公鑰文件生成了我的 CSR:

openssl genrsa -out myservername.key 2048 (new key)
openssl req -new -key myservername.key -out myservername.csr 

我給他們發了 CSR,他們給我發回了簽名的 .crt 文件。

我為我的 CA 密鑰和證書創建了一個目錄並將它們放在那裡。

我的 httpd.conf 的相關部分如下所示:

<VirtualHost _default_:443>
SSLEngine on
SSLCACertificateFile /var/cosign/certs/CA/publickey.pem
SSLCertificateFile /var/cosign/certs/myserver.crt
SSLCertificateKeyFile /var/cosign/certs/myserver.key

DocumentRoot /var/www/html/
<Directory /var/www/html>
   Options -Indexes
   AllowOverride All
</Directory>

但它沒有將此證書用於 SSL。如果我執行此命令:

openssl s_client -connect localhost:443 -showcerts

我明白了:

CONNECTED(00000003)
depth=0 C = --, ST = SomeState, L = SomeCity, O = SomeOrganization, OU = SomeOrganizationalUnit, CN = portcharlotte, emailAddress = root@portcharlotte
verify error:num=18:self signed certificate
verify return:1
depth=0 C = --, ST = SomeState, L = SomeCity, O = SomeOrganization, OU =     SomeOrganizationalUnit, CN = portcharlotte, emailAddress = root@portcharlotte
verify return:1
---
Certificate chain

我的 CSR 包含適當的細節,而不是我猜是預設設置的“SomeState”、“SomeCity”廢話。

openssl 模組已安裝並載入。

我在日誌中得到的唯一錯誤是:

[Fri Jan 25 13:27:40 2013] [warn] RSA server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)
[Fri Jan 25 13:27:40 2013] [warn] RSA server certificate CommonName (CN) `portcharlotte' does NOT match server name!?

我猜這種不匹配是因為它使用了錯誤的證書。

我的問題是,如何讓它使用正確的?我錯過了什麼?

SSLCACertificateFile /var/cosign/certs/CA/publickey.pem

除非該 PEM 文件實際上包含您希望授予訪問權限的***客戶端證書的 CA 證書,否則這是不正確的;***要為 apache 提供證書鏈,請SSLCertificateChainFile改用。

Apache 必須具有用於簽署/生成端點證書的實際證書和任何中間證書,包括瀏覽器信任的根證書。

要驗證他們給您的證書,請執行:

openssl verify -CApath /path/to/CA/certs -purpose sslserver -verbose /your/certificate

除了證書問題之外,您SSLRequireSSL的虛擬主機中還缺少一條指令;沒有它,apache 將不會檢查安全連接。

您也不應該_default_用作虛擬主機,並且您缺少一個ServerName.

使用 *:443 或 IP:443 作為虛擬主機。

每個 vhost 都必須有一個有效的 ServerName 集,此外,SSL vhost 必須有一個與證書的 CN 對應的 ServerName。

例如:

<VirtualHost 1.2.3.4:443>
 ServerName your.certificates.common.name
 ServerAlias any.subject.alternate.names

 DocumentRoot /your/protected/content

 SSLEngine On
 SSLCertificateChainFile /path/to/your/issuers/CA/cert/bundle

 SSLCertificateFile /path/to/your/certificate.crt
 SSLCertificateKeyfile /path/to/your/private.key
-OR- 
 SSLCertificateFile /path/to/your/combined.cert-and-keyfile

 SSLRequireSSL

</VirtualHost>

研究一下文件。

引用自:https://serverfault.com/questions/472390