Подтвердить что ты не робот

Java keytool - простой способ добавить серверный сертификат из url/port

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

4b9b3361

Ответ 1

Смотрел, как доверять сертификату при использовании 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}

Ответ 2

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

  • Firefox: Добавить исключение → Получить сертификат → Вид → Подробности → Экспорт...
  • KeyMan (http://www.alphaworks.ibm.com/tech/keyman) Вы можете получить сертификат SSL непосредственно из меню Файл → Импорт
  • InstallCert (Код Andreas Sterbenz)
    java InstallCert [host]:[port] 
    keytool -exportcert -keystore jssecacerts -storepass changeit -file output.cert
    keytool -importcert -keystore [DESTINATION_KEYSTORE] -file output.cert

Ответ 3

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

Ответ 4

Просто выложите 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

Ответ 5

Я использую 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