JettyでSSLを構成しようとしています。
私はこれを読みました: http://docs.codehaus.org/display/JETTY/How+to+configure+SSL そしてキーストアを作成しました。
次に、セクション4に直接ジャンプしました。しかし、この構成ファイルはどこにJettyを構成すべきですか?
Jetty.xmlを検索しようとしましたが、私のコンピューターにはそのようなものはありません...
私はそれを機能させるのに多くの問題を抱えていましたが、私はそれを実現する方法をついに知りました。私はJava 7でubuntu 10.04を使用しています。それはウィンドウの下で行うことが可能かもしれませんが、すべてのコマンド行はbashコマンドです。
Jetty 8.1.8を使用しました。 codehaus からダウンロードして、Linux用の.tar.gzファイル(Windows用の.Zip)を選択します。
任意のディレクトリでファイルを解凍します。これは、この記事/回答のために{jetty}ホームフォルダーになります。
{jetty}/etcディレクトリに移動します。
次のすべてのコマンドラインを順番に実行します。パスワードが求められるたびに、常に同じパスワードを入力してください。パスワードは、キーファイル、キーストア、および証明書自体を保護するために使用されます。キーストアのロックを解除するか、生成されたキーを使用するようにパスワードが要求される場合があります。すべてが何であるか、およびパスワードを正しく使用する方法を理解したら、準備ができたと感じたときにそれらのパスワードを変更することができます(運用環境で使用する方が安全です)。それ以外の場合は、要求されたときに要求された情報を入力します。
openssl genrsa -des3 -out jetty.key
openssl req -new -x509 -key jetty.key -out jetty.crt
keytool -keystore keystore -import -alias jetty -file jetty.crt -trustcacerts
openssl req -new -key jetty.key -out jetty.csr
openssl pkcs12 -inkey jetty.key -in jetty.crt -export -out jetty.pkcs12
keytool -importkeystore -srckeystore jetty.pkcs12 -srcstoretype PKCS12 -destkeystore keystore
ここで、{jetty} /etc/jetty-ssl.xmlを編集し、証明書の生成時に使用したパスワードと一致するようにパスワードを構成する必要があります。パスワードを難読化する場合は、コマンドラインに戻ります。 {jetty}ホームディレクトリに移動して、次を実行します。
Java -cp lib/jetty-util-8.1.8.v20121106.jar org.Eclipse.jetty.util.security.Password "{PASSWORD}"
実際のパスワードの{PASSWORD}を変更し、jetty-ssl.xmlにあるすべてのパスワードフィールドの「OBF:」を含む難読化されたパスワードを過ぎます。そのように難読化されたパスワードは、人間にとって読みにくいが、プログラムで簡単に解読されることに注意してください。開発者がファイルを編集するときにパスワードを知ることができなくなるだけです。すべての構成ファイルは適切に保護する必要があり、それらのアクセスは可能な限り制限する必要があります。
{jetty} /start.iniを編集して、行#etc/jetty-ssl.xmlのコメントを外します(#)。
桟橋を開始:
Java -jar start.jar
サーバーの連絡先:https://localhost:8443
できた!
この回答は、jettyでSSLを有効にする簡単な方法であることに注意してください。本番環境で安全にするには、この件についてさらに読む必要があります。
キーストアの経験が豊富になった後、回答が更新されました。このソリューションは、中間証明書(29/07/2015)で完全に機能することを保証します。
注:PEM形式は読み取り可能なファイルを意味し、証明書は---BEGIN CERTIFICATE---
で始まり、秘密鍵は-----BEGIN PRIVATE KEY-----
行で始まります。
これは、簡単なステップバイステップガイドです。空のディレクトリから始めます。
秘密鍵(PEMエンコードされた.key)がある場合は、手順2に進みます。
証明書署名要求がある場合はステップ3に進みます(PEMエンコードされた.csr)
証明書(PEMエンコードされた.crtまたは.pem)がある場合は、手順4に進みます。
(パスワードなしの)秘密鍵を準備します。
openssl genrsa -des3 -passout pass:1 -out domain.pass.key 2048
openssl rsa -passin pass:1 -in domain.pass.key -out domain.key
rm domain.pass.key
証明書署名要求(CSR)を準備します。キーを使用してこれを生成します。求められたら関連情報を入力します。 -sha256
の使用に注意してください。これがないと、最新のブラウザーは警告を生成します。
openssl req -key domain.key -sha256 -new -out domain.csr
証明書を準備します。一つを選ぶ:
a)自分で署名する
openssl x509 -req -days 3650 -in domain.csr -signkey domain.key -out domain.crt
b)当局に送る
SSLプロバイダーは、証明書とその中間証明書をPEM形式で提供します。
トラストチェーンに追加し、PKCS12形式でパッケージ化します。最初のコマンドは、便宜上キーストアのパスワードを設定します(そうでない場合は、パスワードを数十回入力する必要があります)。安全のために別のパスワードを設定してください。
export PASS=LW33Lk714l9l8Iv
一つを選ぶ:
a)自己署名証明書(中間証明書は不要)
openssl pkcs12 -export -in domain.crt -inkey domain.key -out domain.p12 -name domain -passout pass:$PASS
keytool -importkeystore -deststorepass $PASS -destkeypass $PASS -destkeystore domain.keystore -srckeystore domain.p12 -srcstoretype PKCS12 -srcstorepass $PASS -alias domain
b)中間証明書を含める必要がある
中間証明書をダウンロードし、それらを1つのファイルに連結します。順序はルートの下位である必要があります。
cat sub.class1.server.ca.pem ca.pem > ca_chain.pem
チェーンファイルに入れられた順序に応じて、チェーンファイルの各中間証明書に-caname
パラメーターを使用します。
openssl pkcs12 -export -in domain.crt -inkey domain.key -out domain.p12 -name domain -passout pass:$PASS -CAfile ca_chain.pem -caname sub1 -caname root -chain
keytool -importkeystore -deststorepass $PASS -destkeypass $PASS -destkeystore domain.keystore -srckeystore domain.p12 -srcstoretype PKCS12 -srcstorepass $PASS -alias domain
重要な注意:keytool -list
は1つのエントリのみをリストし、中間証明書はリストしませんが、完全に機能します。
Jettyを構成します。
domain.keystore
ファイルをJETTY_HOME/etc /に移動します。
一つを選ぶ:
a)新しいstart.ini
スタイル構成(Jetty 8+)を使用しています:
jetty.keystore=etc/domain.keystore
jetty.truststore=etc/domain.keystore
jetty.keystore.password=LW33Lk714l9l8Iv
jetty.keymanager.password=LW33Lk714l9l8Iv
jetty.truststore.password=LW33Lk714l9l8Iv
b).xmlファイルで古いスタイルの構成を使用しています(新しいスタイルにアップグレードする必要があります!):
JETTY_HOME/etc/jetty-ssl.xml
ファイルを編集し、以下の部分を変更します。パスワード部分をパスワードに合わせて交換します。キーにパスワードがないため、KeyManagerPassword
を定義しません。
<Configure id="Server" class="org.Eclipse.jetty.server.Server">
<New id="sslContextFactory" class="org.Eclipse.jetty.http.ssl.SslContextFactory">
<Set name="KeyStore"><Property name="jetty.home" default="." />/etc/keystore</Set>
<Set name="KeyStorePassword">LW33Lk714l9l8Iv</Set>
<Set name="TrustStore"><Property name="jetty.home" default="." />/etc/keystore</Set>
<Set name="TrustStorePassword">LW33Lk714l9l8Iv</Set>
</New>
<Call name="addConnector">...</Call>
</Configure>
Start.iniファイルを編集して、jetty-ssl.xmlファイルを含めます。
桟橋を(再)起動します。
このキーストアファイルは、Tomcatなどの他のコンテナでも使用できることに注意してください。幸運を!
Godaddyから年額6ドルで証明書を購入しました。それが続く間、大いに。これらのサイトとJean-Philippe Gravelの回答に基づいて、Amazon EC2/Ubuntu/Jettyでセットアップするために私が従った手順を次に示します。
http://docs.codehaus.org/display/JETTY/How+to+configure+SSL
http://community.xmatters.com/docs/DOC-1228#.UgWsI1MU7lc
keytool -keystore keystore -alias jettykey -genkey -keyalg RSA
「姓と名」はFQDN(http://なし)でなければならないことに注意してください。私の最初の試みで、私は名と姓を忠実に付けましたが、godaddyは良い警告を受け取って拒否しました。
GodaddyのCSRファイルを生成します。
keytool -certreq -alias jetty -keystore keystore -file jetty.csr
これをGodaddyフォームで送信して、BEGIN/END "NEW CERTIFICATE REQUEST"を含む証明書を作成します。
(Godaddyではサイトを確認する必要があります。これにはいくつかの方法があり、プロキシ経由でドメイン名を購入したので、godaddyで生成されたhtmlページをホストすることで確認が最も簡単で迅速であることがわかりました。)
Godaddyから証明書と中間証明書の両方を含むZipをダウンロードします。選択できるサーバータイプのリストがあります。 「その他」を選択します。次に、証明書を中間証明書と組み合わせます。
cat mydomain.com.crt Gd_bundle.crt > certchain.txt
秘密鍵をエクスポートする
keytool -importkeystore -srckeystore keystore -destkeystore intermediate.p12 -deststoretype PKCS12
openssl pkcs12 -in intermediate.p12 -out jettykey.pem -nodes
秘密鍵と証明書を組み合わせる
openssl pkcs12 -export -inkey jettykey.pem -in certchain.txt -out jetty.pkcs12
pkcs12証明書のインポート(エイリアスは1になります)
keytool -importkeystore -srckeystore jetty.pkcs12 -srcstoretype PKCS12 -destkeystore keystore
(キーストアをバックアップしてから元のキーを削除しました。トラブルシューティング中にこれを行いました。これはJettyで必要な場合と必要でない場合があります。)
keytool -delete -keystore keystore -alias jettykey
Sudo cp keystore /usr/share/jetty/etc/
Sudo vi /usr/share/jetty/etc/jetty-ssl.xml
それに応じて、your.store.password、your.key.password、およびyour.trust.passwordを変更します。難読化する場合は、使用します
Java -cp /usr/share/jetty/lib/jetty.jar:/usr/share/jetty/lib/jetty-util.jar org.mortbay.jetty.security.Password <your.password>
Jetty-ssl.xmlファイルをロードするようJettyに指示します。
Sudo echo "/etc/jetty/jetty-ssl.xml" >> /etc/jetty/jetty.conf
Sudo /sbin/iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443
(Amazon EC2セキュリティグループも変更して、443を許可します)
Sudo service jetty start
Jettyのデフォルト構成ファイルは$JETTY_HOME/etc/jetty.xml
にあります
Mavenのjettyプラグインを使用している場合、pom.xmlファイルでsslキーストアの詳細を指定する必要があります。 この質問 を参照してください
Jetty 9.3を使用している場合は、start.d/ssl.ini
:
jetty.sslContext.keyStorePath=mystore.jks
jetty.sslContext.keyStorePassword=X
jetty.sslContext.keyManagerPassword=X
jetty.sslContext.trustStorePath=mystore.jks
jetty.sslContext.trustStorePassword=X
どこ:
mystore.jks
は、keytool
で生成されたストアですX
はプレーンテキストのパスワードです(誤ったセキュリティを与えるだけなので、難読化をスキップすることをお勧めします)ストアは、Tomcat用に生成するものとまったく同じです。別のJavaバージョンを使用して、問題にならないキーストアを生成した場合でも。
JettyをMavenプラグインとしてWindowsで試す場合、次の手順が役立ちます。
pom.xml
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.11.v20130520</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<webApp>
<contextPath>/yourappcontext</contextPath>
</webApp>
<connectors>
<connector implementation="org.Eclipse.jetty.server.nio.SelectChannelConnector">
<port>9090</port>
<maxIdleTime>1</maxIdleTime>
</connector>
<connector implementation="org.Eclipse.jetty.server.ssl.SslSocketConnector">
<port>9443</port>
<keystore>src/test/resources/keystore</keystore>
<keyPassword>123456</keyPassword>
<password>123456</password>
</connector>
</connectors>
</configuration>
</plugin>
JDKツールkeytool
を使用してキー/証明書を生成します。
keytool -keystore keystore -alias jetty -genkey -keyalg RSA
このコマンドは、ファイルkeystore
を生成します。このファイルは、次の(またはkeystore
要素で設定されるまでは何でも)パスsrc/test/resources/keystore
。