web-dev-qa-db-ja.com

httpdで正しいSSLを使用できない

大学が発行した署名付き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!?

この不一致は、間違った証明書を使用しているためだと思います。

私の質問は、正しいものを使用するにはどうすればよいですか?何が欠けていますか?

7
monkeymatrix

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>

ドキュメントを少し調べます。

11
adaptr

走る

# 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があり、ディストリビューションのデフォルトのセットアップで定義されたものが優先されると想定しています。

3
fuero