Java keytool простой способ добавить сертификат сервера из URL / порта - PullRequest
39 голосов
/ 10 сентября 2010

У меня есть сервер с самозаверяющим сертификатом, но также требуется аутентификация сертификата на стороне клиента. Я с трудом пытаюсь получить сертификат необработанного CA-сервера, чтобы я мог импортировать его в хранилище ключей. У кого-нибудь есть предложения о том, как легко это сделать? Спасибо.

Ответы [ 5 ]

76 голосов
/ 19 апреля 2014

Изучал, как доверять сертификату при использовании 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}
21 голосов
/ 10 сентября 2010

Я нашел несколько способов сделать это:

    java InstallCert [host]:[port] 
    keytool -exportcert -keystore jssecacerts -storepass changeit -file output.cert
    keytool -importcert -keystore [DESTINATION_KEYSTORE] -file output.cert
6 голосов
/ 04 декабря 2018

Я использую openssl, но если вы предпочитаете этого не делать или находитесь в системе (в частности, в Windows), в которой его нет, , так как Java 7 в 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 всегда, а для более ранних версий во многих случаях Java может использовать файл PKCS12 для хранилища ключей вместо традиционного файла JKS, а 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 
4 голосов
/ 10 сентября 2010

Вы можете экспортировать сертификат, используя Firefox, на этом сайте есть инструкции. Затем вы используете keytool для добавления сертификата.

1 голос
/ 04 декабря 2018

Просто предоставьте ответ 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
...