web-dev-qa-db-ja.com

SSL相互(双方向)認証の構成

多くのチュートリアル、多くのページ、多くの質問があり、これらはこの問題の実装が異なります "SSL相互(双方向)認証の構成"。私はLinuxでそれをしなければならず、どこから始めればいいのか、どの手順に従うべきか分かりません。

私がしなければならないのは:

  • 私はサーバーと多くのクライアントを持っていますが、サーバーからの署名付き証明書がある場合にのみ、サーバー上のコードにアクセスできます。
  • サーバーはこれらの証明書を生成し、それらを無効にできます。メインサーバーはCAです。つまり、他のユーザーの証明書を生成して署名する必要があります。

私は何をすべきかを考えていました

  1. cA証明書を生成する
  2. 他のユーザーの証明書を生成します。
  3. ユーザーに証明書を渡します。
  4. 証明書に署名します。
  5. 証明書を確認します。
  6. ユーザーの証明書を再生成するか、無効にします。
  7. ユーザーは1つのデバイスから署名するだけです。 (証明書はコピーしないでください)

私は何かを見逃しましたか? rootユーザーになる必要がありますか?これのための準備ができているbashはありますか? Linuxには複数のopenssl.cnfファイルがあるのはなぜですか?私がCA証明書をどこに置くべきかについて、どんな情報もいただければ幸いです。

25
SafeY

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
  • CAを生成する

必要に応じて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

参照:

OpenSSL オンラインドキュメントおよび Apache オンラインドキュメント。

18
dawud