web-dev-qa-db-ja.com

Apacheクライアント証明書認証エラー:証明書の検証:エラー(18):自己署名証明書

そのため、Apache2 w/mod_sslでクライアント証明書認証を設定する手順に従っています。これは、CAAに対してアプリケーションをテストすることのみを目的としており、いかなる種類の本番環境での使用も目的としていません。

これまでのところ、CA、サーバー、およびクライアントの暗号化情報を生成するためのアドバイスとして、_http://www.impetus.us/~rjmooney/projects/misc/clientcertauth.html_を使用してきました。 3つすべてを_/etc/ssl/ca/private_に入れました。 default_sslサイトファイルに次の追加のディレクティブを設定しました。

_<IfModule mod_ssl.c>
<VirtualHost _default_:443>
...
    SSLEngine on
    SSLCertificateFile    /etc/ssl/ca/private/server.crt
    SSLCertificateKeyFile /etc/ssl/ca/private/server.key
    SSLVerifyClient require
    SSLVerifyDepth 2

    SSLCACertificatePath /etc/ssl/ca/private
    SSLCACertificateFile /etc/ssl/ca/private/ca.crt
    <Location />
            SSLRequireSSL
            SSLVerifyClient require
            SSLVerifyDepth 2
    </Location>
    <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
            SSLOptions +StdEnvVars
    </Directory>
...
</VirtualHost>
</IfModule>
_

P12ファイルをChromeにインストールしましたが、 https:// localhost にアクセスすると、次のエラーが発生します

Chrome:Error 107 (net::ERR_SSL_PROTOCOL_ERROR): SSL protocol error.

Apache:Certificate Verification: Error (18): self signed certificate

推測しなければならない場合、私のディレクティブの1つは、自分で作成したCAを使用してp12をロードおよび検証するように正しく設定されていません。しかし、私はそれが何であるかを理解する私の人生のためにすることはできません。私を正しい方向に向けることができる、ここでもっと経験がある人はいますか?

3
decoy

まず、SSLCACertificatePathSSLCACertificateFileの両方を同時に使用することは避けてください。 SSLCACertificatePathは、信頼するCA証明書ごとに1つずつ、複数のファイルを含むディレクトリを指すために使用されます。 SSLCACertificateFileは、信頼できるすべてのCA証明書を連結した単一のファイルを指すために使用されます。 SSLCACertificatePathが秘密鍵も保持しているディレクトリを指すことは実際には意味がありません(とにかく問題が発生するかどうかはわかりませんが)。

重要なのは、使用しているクライアント証明書がCA証明書の1つ(使用するSSLCACertificatePathまたはSSLCACertificateFileのいずれかによってポイントされる)によって発行されていることです。発行者DNクライアント証明書は、Apache Httpdでこの方法で構成したいずれかのCA証明書のサブジェクトDNである必要があります(さらに、実際にはそのCAによって発行される必要があるため、クライアント証明書の署名はCA証明書の公開鍵によって検証可能でなければなりません。 、ただし、CAを作成し、証明書を適切に発行したと想定しています。念のため、これを確認することをお勧めします)。

証明書の内容(CAかどうか)をPEM形式(多くの場合.pemまたは.crt)使用:

openssl x509 -text -noout -in filename.pem

(これにより、証明書に関する十分な情報が表示されます。)

編集:

証明書に問題がある場合に備えて、次のテスト証明書を試すことができます。

http://jsslutils.googlecode.com/svn/tags/jsslutils-root-1.0.7/certificates/src/main/resources/org/jsslutils/certificates/local/

(すべてのパスワードはtesttestです。)

インポートできますtestclient.p12ブラウザに。 cacert.pemはPEM形式のCA証明書であり、localhost-cert.pemlocalhostのサーバー証明書です(したがって、マシン自体からのテストを目的としています)。 localhost-key.pemはサーバー証明書の秘密鍵です。次を使用して保護を解除できます。

openssl rsa -in localhost-key.pem -out localhost-key-unprotected.pem

信頼する必要があるかもしれませんcacert.pem一時的にブラウザで削除しますが、テスト後に削除します(明らかに、testtestはそれほど秘密ではないため、誰でもこのCAを使用できます)。

4
Bruno

私は同じ問題を抱えていました(Nginxの下で)。解決策は、クライアントの共通名をサーバーの証明書の共通名以外のものにすることでした。もともと、私の証明書CNはサーバー証明書のFQDNと一致する必要があると思っていました。

例:

Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:Minnesota
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCo
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:Ryan Pendergast
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Signature ok
subject=/C=US/ST=Minnesota/O=MyCo/CN=Ryan Pendergast/[email protected]
2
rynop

私もnginxでこの問題を抱えていました。@ rynopと同様に、ソリューションは命名を正しく行うことがわかりました。

私の場合、クライアントCAとクライアント証明書の組織/共通名が異なることを確認すると、これは解決されました。

名前が同じである場合、nginx/opensslは、CAによって署名された証明書ではなく、自己署名証明書を参照します。

次のガイドは、nginxを使用したクライアント証明書認証の設定に役立ち、CAと証明書に異なる名前を使用するようにガイドします。

https://Gist.github.com/mtigas/952344#convert-client-key-to-combined-pem

0
u-phoria