web-dev-qa-db-ja.com

Java keytool url / portからサーバー証明書を追加する簡単な方法

自己署名証明書を持つサーバーがありますが、クライアント側の証明書認証も必要です。生のCAサーバー証明書を取得して、キーストアにインポートできるようにするのに苦労しています。誰でも簡単にそれを行う方法についていくつかの提案がありますか?ありがとう。

41
wuntee

Jenkins cliの使用中に証明書を信頼する方法を探していたところ、 https://issues.jenkins-ci.org/browse/JENKINS-12629 が見つかりました。これにはいくつかのレシピがあります。

これにより、証明書が取得されます。

openssl s_client -connect ${Host}:${PORT} </dev/null

証明書の部分のみに関心がある場合は、次のようにパイプして切り取ります。

| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'

そしてファイルにリダイレクトします:

> ${Host}.cert

次に、keytoolを使用してインポートします。

keytool -import -noprompt -trustcacerts -alias ${Host} -file ${Host}.cert \
    -keystore ${KEYSTOREFILE} -storepass ${KEYSTOREPASS}

一度に:

Host=myhost.example.com
PORT=443
KEYSTOREFILE=dest_keystore
KEYSTOREPASS=changeme

# get the SSL certificate
openssl s_client -connect ${Host}:${PORT} </dev/null \
    | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ${Host}.cert

# create a keystore and import certificate
keytool -import -noprompt -trustcacerts \
    -alias ${Host} -file ${Host}.cert \
    -keystore ${KEYSTOREFILE} -storepass ${KEYSTOREPASS}

# verify we've got it.
keytool -list -v -keystore ${KEYSTOREFILE} -storepass ${KEYSTOREPASS} -alias ${Host}
77
dnozay

これを行うにはいくつかの方法がありました。

 Java InstallCert [Host]:[port] 
 keytool -exportcert -keystore jssecacerts -storepass changeit -file output.cert 
 keytool -importcert -keystore [DESTINATION_KEYSTORE] -file output.cert 
22
wuntee

私はopensslを使用しますが、それを望まない場合、またはそれを持たないシステム(特にWindows)上にある場合は、since Java 7 in 2011 keytoolはジョブ全体を実行できます

 keytool -printcert -sslserver Host[:port] -rfc >tempfile
 keytool -import [-noprompt] -alias nm -keystore file [-storepass pw] [-storetype ty] <tempfile 
 # or with noprompt and storepass (so nothing on stdin besides the cert) piping works:
 keytool -printcert -sslserver Host[:port] -rfc | keytool -import -noprompt -alias nm -keystore file -storepass pw [-storetype ty]

逆に、Java 9 up always、および以前のバージョンでは多くの場合、Javaは、従来のJKSファイルの代わりにPKCS12ファイルをキーストアに使用できます。およびOpenSSLはPKCS12を作成できます keytoolの支援なしで:

openssl s_client -connect Host:port </dev/null | openssl pkcs12 -export -nokeys [-name nm] [-passout option] -out p12file
# <NUL on Windows
# default is to Prompt for password, but -passout supports several options 
# including actual value, envvar, or file; see the openssl(1ssl) man page 
6

Firefoxを使用して証明書をエクスポートできます。 このサイト に説明があります。次に、 keytool を使用して証明書を追加します。

4
Jon Freedman

関数に対する dnozay の回答を公開するだけで、複数の証明書を同時にインポートできます。

#!/usr/bin/env sh

KEYSTORE_FILE=dest_keystore
KEYSTORE_PASS=changeit


import_cert() {
  local Host=$1
  local PORT=$2

  # get the SSL certificate
  openssl s_client -connect ${Host}:${PORT} </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ${Host}.cert

  # delete the old alias and then import the new one
  keytool -delete -keystore ${KEYSTORE_FILE} -storepass ${KEYSTORE_PASS} -alias ${Host} &> /dev/null

  # create a keystore and import certificate
  keytool -import -noprompt -trustcacerts \
      -alias ${Host} -file ${Host}.cert \
      -keystore ${KEYSTORE_FILE} -storepass ${KEYSTORE_PASS}

  rm ${Host}.cert
}

import_cert stackoverflow.com 443
import_cert www.google.com 443
import_cert 172.217.194.104 443 # google
1
Ninh Pham