多くのチュートリアル、多くのページ、多くの質問があり、これらはこの問題の実装が異なります "SSL相互(双方向)認証の構成"。私はLinuxでそれをしなければならず、どこから始めればいいのか、どの手順に従うべきか分かりません。
私がしなければならないのは:
私は何をすべきかを考えていました
私は何かを見逃しましたか? rootユーザーになる必要がありますか?これのための準備ができているbashはありますか? Linuxには複数のopenssl.cnfファイルがあるのはなぜですか?私がCA証明書をどこに置くべきかについて、どんな情報もいただければ幸いです。
Opensslと一緒に配布された便利なスクリプトCA.sh
を使用して、この作業のほとんどを実行できます。その場所はディストリビューションによって異なります。 Debianとその派生物では、次の方法で検索できます。
# apt-file search CA.sh
openssl: /usr/lib/ssl/misc/CA.sh
また、RedHatとその派生物(近似)は次のとおりです。
# yum provides */CA
1:openssl-1.0.1e-4.fc18.x86_64 : Utilities from the general purpose cryptography library with TLS implementation
Repo : @updates
Matched from:
Filename : /etc/pki/tls/misc/CA
これは、CAの管理に必要なディレクトリ構造の作成を容易にする非常にシンプルなbashスクリプトです(openssl.cnfの[ CA_default ]
セクションで説明されています)。それを使用して、コードを見て実際に何が行われているかを確認することをお勧めします。
# ./CA.sh -help
usage: ./CA.sh -newcert|-newreq|-newreq-nodes|-newca|-sign|-verify
このスクリプトは、openssl.cnfで提供されるデフォルトを使用します。また、openssl $command
を使用しない場合は、-config
スイッチを使用して、CA.sh
への引数として1つの構成ファイルを提供できます。 openssl.cnf
ファイルの場所もディストリビューション固有であり、上記と同じコマンドを使用して検索できます。必要なのは、openssl
パッケージによって提供されるものです。
次のセクションを変更する必要があります。
[ CA_default ]
default_days = 365 # how long to certify for
default_crl_days= 30 # how long before next CRL
[ req ]
default_bits = 2048
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = AU
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Some-State
localityName = Locality Name (eg, city)
0.organizationName = Organization Name (eg, company)
0.organizationName_default = Internet Widgits Pty Ltd
#1.organizationName = Second Organization Name (eg, company)
#1.organizationName_default = World Wide Web Pty Ltd
organizationalUnitName = Organizational Unit Name (eg, section)
#organizationalUnitName_default =
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 64
必要に応じてopenssl.cnf
を編集したら、CA証明書を生成できます。承認済みのサードパーティCAによって署名されたこのCAが必要かどうかに応じて、署名用に送信する自己署名CAまたはCSRを生成できます。
./CA.sh -newca
いくつかの質問をするように対話的に求められます。デフォルトは角括弧の間に表示されます。ここでopenssl.cnf
で変更したオプションを認識します。
同じスクリプトを使用して、サーバーの証明書要求を作成できます。
./CA.sh -newreq
ここでも、いくつかの質問をするように求められます。最も重要なのは、証明書の共通名です。これは、サーバーのIPのDNS解決可能な名前と一致する必要があります(または/etc/hosts
などの他の方法を使用できます)。推奨されていません。維持と拡張が困難です)
取得するのは証明書署名要求(略してCSR)です。これは、以前に作成した認証局(CA)によって署名されます。
./CA.sh -sign
CSRの作成とCAによる署名の取得の手順を繰り返します。その際、サーバーを構成するために後で必要になるため、一般名、組織、組織単位のフィールドの入力方法に注意してください。
クライアント証明書をそれぞれの秘密鍵およびCA証明書と一緒に配布する適切な方法は、p12バンドルを使用することです。
openssl pkcs12 -export -in Certificates/client.pem -inkey client.key -certfile CA.pem -out clientcert.p12
参照しているサーバーがApache Webサーバーであるとしましょう。サーバー証明書を取得したら、適切なVHOST
を構成して、相互SSL認証によって保護されるコンテンツを提供します。このphpmyadmin
仮想ホストがその例です。これはApache 2.4サーバーで機能するため、現状のまま使用せず、慎重に確認およびテストして、ニーズに適合させてください。
Listen 443 https
<VirtualHost 120.120.120.120:443>
DocumentRoot "/srv/www/html"
ServerAdmin [email protected]
SSLCACertificateFile /etc/pki/CA/cacert.pem
SSLCertificateFile /etc/pki/tls/private/phpmyadmin.company.com/newcert.pem
SSLCertificateKeyFile /etc/pki/tls/private/phpmyadmin.company.com/newkey.pem
SSLCARevocationCheck chain
SSLCARevocationFile /etc/pki/CA/crl/crl.pem
SSLEngine on
SSLStrictSNIVHostCheck on
SSLVerifyClient require
SSLVerifyDepth 5
ServerName phpmyadmin.company.com
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteCond %{HTTPS} !=on
RewriteRule . - [F]
Alias /console /usr/share/phpMyAdmin
ErrorLog "|/usr/sbin/rotatelogs -L /var/log/httpd/phpmyadmin/error.log -f /var/log/httpd/phpmyadmin/error.log.%Y%m%d 86400"
CustomLog "|/usr/sbin/rotatelogs -L /var/log/httpd/phpmyadmin/access.log -f /var/log/httpd/phpmyadmin/access.log.%Y%m%d 86400" logstash_json
<Directory /usr/share/phpMyAdmin/>
Require ssl
Require ssl-verify-client
SSLRequireSSL
SSLOptions +FakeBasicAuth +StrictRequire
SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 256
SSLRequire %{SSL_CLIENT_S_DN_O} eq "Awesome Company" \
and %{SSL_CLIENT_S_DN_OU} eq "Development" \
and %{SSL_CLIENT_S_DN_CN} in {"John Doe", "Jane Doe"}
SSLRenegBufferSize 131072
</Directory>
</VirtualHost>
必要なだけディレクトリごとのアクセス制御を使用できます。重要な部分は、表示されるクライアント証明書がSSLRequire
ディレクティブによって課される制限に準拠している必要があることです。つまり、組織、組織単位、および共通名の条件(または証明書のその他のフィールド)。これらのフィールドは、クライアント証明書から取得されます。
クライアント証明書へのアクセスを取り消すことができるようにするには、CRLを生成する必要があります。それを行うコマンド(CAディレクトリ構造の最上位にいる場合):
openssl ca -config /path/to/openssl.cnf -gencrl -out crl/crl.pem
その後、次のコマンドを使用して、必要に応じてクライアント証明書を取り消します。
openssl ca -config /path/to/openssl.cnf -revoke clientcert.pem
参照: