У меня есть некоторые ресурсы, к которым я должен получить доступ с SSL, то использование самоподписало сертификаты. В целом большинство инструментов имеет простую установку, чтобы позволить им быть полученными доступ без ошибки или просто предупреждения. Однако это походит на надлежащий способ сделать, что это с JVM должно импортировать сертификат подписания в keystore как Приблизительно.
У меня есть отличный сценарий, который я хотел бы использовать, но я предпочту, чтобы мой сценарий работал автономный над любой любой JVM, не изменяя keystore или распределяя новый keystore. Существует ли простой способ переопределить проверку сертификации?
После небольшого исследования я нашел этот пост . Вот что я в итоге использовал:
import javax.net.ssl.HostnameVerifier
import javax.net.ssl.HttpsURLConnection
import javax.net.ssl.SSLContext
import javax.net.ssl.TrustManager
import javax.net.ssl.X509TrustManager
def nullTrustManager = [
checkClientTrusted: { chain, authType -> },
checkServerTrusted: { chain, authType -> },
getAcceptedIssuers: { null }
]
def nullHostnameVerifier = [
verify: { hostname, session -> true }
]
SSLContext sc = SSLContext.getInstance("SSL")
sc.init(null, [nullTrustManager as X509TrustManager] as TrustManager[], null)
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory())
HttpsURLConnection.setDefaultHostnameVerifier(nullHostnameVerifier as HostnameVerifier)
Используйте на свой страх и риск: это подрывает проверку сертификата!
] Если вы вызываете программу командной строки curl
, а не используете собственные инструменты groovy / JVM, вы можете отключить проверку сертификатов для своего пользователя, выполнив следующую команду из командной строки:
$ echo 'insecure' >>~/.curlrc
Мне просто пришлось пройти через это с приложение Grails, над которым я работаю. Вы будете иметь дело с хранилищем ключей только один раз. Предполагая, что у вас есть сертификат, просто поместите его в хранилище ключей, а затем укажите свой jvm в хранилище ключей с помощью свойств командной строки ...
edit - я не знаю никакого способа обойти необходимость в хранилище ключей. Но вы можете создать его, используя только необходимые сертификаты, и передать его вместе с вашим приложением. Вы делаете это только один раз.
edit edit - вот команда для keytool и java CL prop
keytool -import -trustcacerts -alias www.the-domain.com -file the-cert.der -keystore store.jks
-Djavax.net.ssl.trustStore=/path/to/store.jks