大学が発行した署名付き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ファイルに実際にアクセスを許可するclient証明書のCA証明書が含まれていない限り、これは間違っています; Apacheに証明書チェーンを提供するには、代わりにSSLCertificateChainFile
を使用します。
Apacheには、実際の証明書と、エンドポイント証明書の署名/生成に使用される中間証明書(ブラウザーによって信頼されるルート証明書まで)が必要です。
彼らから提供された証明書を確認するには、次のコマンドを実行します。
openssl verify -CApath /path/to/CA/certs -purpose sslserver -verbose /your/certificate
証明書の問題とは別に、vhostに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>
走る
# Debian/Ubuntu
Apache2ctl -S
# RHEL/CentOS
httpd -S
次のようなものが生成されます。
*:443 is a NameVirtualHost
default server hostname (/etc/Apache2/sites-enabled/000-default:1)
port 443 namevhost hostname (/etc/Apache2/sites-enabled/000-default:1)
Opensslコマンドを正しいホスト名で実行してvhostにアクセスしていることを確認します。ポート443に複数のvhostがあり、ディストリビューションのデフォルトのセットアップで定義されたものが優先されると想定しています。