HTTP用SSHキー

HTTP用SSHキー

ブラウザがアクセスするには、一致するキーを持つ必要があるようにhttpトラフィックのSSHキーなどを設定できますか?

答え1

あなたが探しているもの相互SSL認証

一般に配布される Web サーバーの場合Apacheそして一般的に展開されるSSL / TLSの実装OpenSSL、次のように進みなさい:

ほとんどのタスクを実行する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スクリプトです([ CA_default ]openssl.cnfセクションで説明されています)。私はあなたがそれを使用し、それが実際に何をしているのかを確認することをお勧めします。

# ./CA.sh -help
usage: ./CA.sh -newcert|-newreq|-newreq-nodes|-newca|-sign|-verify

スクリプトはopenssl.cnfで提供されているデフォルト値を使用するか、スイッチを使用して設定openssl $commandファイルを引数として提供できます(そうでない場合は、ファイルの場所はディストリビューションによって異なり、上記の同じコマンドを使用できます。参照してください)ものはパッケージに提供されるものです。-configCA.shopenssl.cnfopenssl

次のセクションを変更する必要があります。

[ 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/company.com/newcert.pem
  SSLCertificateKeyFile  /etc/pki/tls/private/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]
  ErrorLog               "|/usr/sbin/rotatelogs -L /var/log/httpd/foo/error.log -f /var/log/httpd/foo/error.log.%Y%m%d 86400"
  CustomLog              "|/usr/sbin/rotatelogs -L /var/log/httpd/foo/access.log -f /var/log/httpd/foo/access.log.%Y%m%d 86400" logstash_json
  <Directory /usr/share/bar/>
    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オンライン文書。

答え2

はい、「クライアント証明書認証」と呼ばれ、スマートカードなどによく使用されます。

必要な製品によっては、正しく機能するのが複雑な場合があります。

関連情報