web-dev-qa-db-ja.com

Tomcatサーバー/クライアントの自己署名SSL証明書

自己署名SSL証明書で実行されているApache Tomcat 6.xサーバーがあります。ユーザーのデータベースに基づいて認証できるように、クライアントに独自の証明書をサーバーに提示してもらいたい。オンラインで見つけた例に基づいてすべて動作していますが、この例には缶詰の証明書とビルド済みのJKSデータストアが付属しています。自分の証明書で独自​​のデータストアを作成したいのですが、運がありません。

Tomcatのデータストアを作成するにはどうすればよいですか?
Tomcatの自己署名証明書を作成するにはどうすればよいですか?

クライアントの自己署名証明書を作成するにはどうすればよいですか?
Tomcatにクライアントの署名を信頼させるにはどうすればよいですか?

私はJava keytoolで何時間も遊んでいます。

44
davidemm

最終的に私の問題の解決策を得たので、他の誰かが動けなくなった場合はここに結果を投稿します。

MichaelのSoftware Thoughts&Ramblings のMichael Martinに感謝します。

デフォルトでは、keytoolは自己署名証明書を生成するときにDSAアルゴリズムを使用します。 Firefoxの以前のバージョンはこれらのキーを問題なく受け入れました。 Firefox 3ベータ5では、DSAの使用は機能しませんが、RSAの使用は機能します。自己署名証明書を生成するときに「-keyalg RSA」を渡すと、Firefox 3ベータ5が完全に受け入れる証明書が作成されます。

私は単純にそのフラグを設定し、FireFoxのすべてのキャッシュをクリアしました。これをプロジェクトのテストセットアップとして使用しており、これを他の人と共有する必要があるため、2つのSSL証明書を作成する小さなバッチスクリプトを作成しました。 1つはTomcatセットアップにドロップでき、もう1つはFireFox/IEにインポートできる.p12ファイルです。ありがとう!

使用法:最初のコマンドライン引数は、クライアントのユーザー名です。すべてのパスワードは「パスワード」です(引用符なし)。ハードコーディングされたビットを必要に応じて変更します。

@echo off
if "%1" == "" goto usage

keytool -genkeypair -alias servercert -keyalg RSA -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass password -keystore server.jks -storepass password
keytool -genkeypair -alias %1 -keystore %1.p12 -storetype pkcs12 -keyalg RSA -dname "CN=%1,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass password -storepass password
keytool -exportcert -alias %1 -file %1.cer -keystore %1.p12 -storetype pkcs12 -storepass password
keytool -importcert -keystore server.jks -alias %1 -file %1.cer -v -trustcacerts -noprompt -storepass password
keytool -list -v -keystore server.jks -storepass password
del %1.cer
goto end

:usage
echo Need user id as first argument: generate_keystore [username]
goto end

:end
pause

結果は2つのファイルです。 Tomcat。にドロップするserver.jksと呼ばれるものと、ブラウザにインポートする{username} .p12と呼ばれる別のファイル。 server.jksファイルには、信頼できる証明書としてクライアント証明書が追加されています。

他の誰かがこれを役に立つと思うことを願っています。

そして、Tomcat conf/sever.xmlファイルに追加する必要があるXMLは次のとおりです(Tomcat 6.xでのみテストされています)。

<Connector
   clientAuth="true" port="8443" minSpareThreads="5" maxSpareThreads="75"
   enableLookups="true" disableUploadTimeout="true"
   acceptCount="100" maxThreads="200"
   scheme="https" secure="true" SSLEnabled="true"
   keystoreFile="${catalina.home}/conf/server.jks"
   keystoreType="JKS" keystorePass="password"
   truststoreFile="${catalina.home}/conf/server.jks"
   truststoreType="JKS" truststorePass="password"
   SSLVerifyClient="require" SSLEngine="on" SSLVerifyDepth="2" sslProtocol="TLS"
/>

Tomcat 7の場合:

<Connector protocol="org.Apache.coyote.http11.Http11NioProtocol"
           port="8443" SSLEnabled="true"
           maxThreads="200" scheme="https" secure="true"
           keystoreFile="${catalina.base}/conf/server.jks" keystorePass="password"
           clientAuth="false" sslProtocol="TLS" />    
60
davidemm

クライアント認証を有効にするには、Tomcatの「信頼ストア」を指定する必要があります。これは、信頼するルート認証局からの証明書を含むキーストアで、それぞれに「trustEntry」のフラグが付けられます。

これは、Connector要素の属性で指定されます:truststoreFiletruststorePass(デフォルトはkeystorePassの値)、およびtruststoreType(デフォルトは「JKS」です)。

クライアントが自己署名証明書を使用している場合、その「ルート」CAは証明書自体です。そのため、クライアントの自己署名証明書をTomcatのトラストストアにインポートする必要があります。

多くのクライアントがいる場合、これはすぐに面倒になります。その場合は、クライアントの証明書に署名することを検討してください。 Java keytoolコマンドはこれを行うことができませんが、必要なコマンドラインユーティリティはすべてOpenSSLで利用可能です。または、 [ 〜#〜] ejbca [〜#〜] 大規模。

さらに良いことに、クライアントに startcom.org のような既存の無料のCAを使用するよう依頼してください。 StartComの証明書はすべてのブラウザーに含まれているわけではないため、これは常にサーバー証明書では機能しませんが、この状況は逆転し、StartComルート証明書はTomcatトラストストアに簡単にインポートできます。

3
erickson

証明書を作成します。

keytool -genkey -alias Tomcat -keyalg RSA -keystore /home/bob/mykeystore

必要な自己署名証明書のすべてのデータを入力してから、Tomcatのserver.xmlを編集し、SSLコネクターのキーストアプロパティを指定します。例:

<Connector port="8443" maxHttpHeaderSize="8192"
        maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
        enableLookups="false" disableUploadTimeout="true"
        acceptCount="100" scheme="https" secure="true"
        keystoreFile="/home/bob/mykeystore"
        clientAuth="false" sslProtocol="TLS" />

またはTomcatのドキュメントに従ってください...

http://Tomcat.Apache.org/Tomcat-6.0-doc/ssl-howto.html

2
Jon

これまでの回答は役に立ちましたが、シェルツールバージョンはありません。だから私はそれを書いた。

key_gen.sh:

#! /bin/bash
# a key generator for https,

basename=server
key_algorithm=RSA
password_key=123456
password_store=123456
country=US

# clean - pre
rm "${basename}.jks"

# generate server side
keytool -genkeypair -alias "${basename}cert" -keyalg $key_algorithm -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=${country}" -keypass $password_key -keystore "${basename}.jks" -storepass $password_store

Tomcat8の場合、次の構成をserver.xmlに追加できます。

    <Connector port="8443" protocol="org.Apache.coyote.http11.Http11NioProtocol"
        maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
        clientAuth="false" sslProtocol="TLS"
        acceptCount="75" keystoreFile="${catalina.home}/conf/server.jks" keystorePass="123456"
    />
1
Eric Wang