Как создать SSLEngine для подключения к любому веб-сайту https, в частности Google Cloud Run? - PullRequest
0 голосов
/ 17 февраля 2020

Поскольку все сертификаты с веб-сайтов подписаны Root центрами сертификации и т. Д., И я пишу клиент, а не сервер, как мне создать SSLEngine, который может подключаться ко всем им? или я должен загрузить сертификаты и тому подобное для подключения? (Я надеюсь, что jdk имеет ту же информацию, что и браузеры, в отношении сертификатов, и поэтому делать это должно быть легко, хотя у меня возникают проблемы с моими навыками поиска Google, поскольку большинство ссылок являются серверами).

РЕДАКТИРОВАТЬ Для большей ясности у меня есть такой код клиента, который работает с самозаверяющим сертификатом. В настоящее время я скачал сертификат с нужного мне сайта, нажав chrome, нажав на замок. Затем я импортировал это в свое хранилище ключей, но оно все еще не работает ...

private SSLEngine createEngine() {
    try {

        InputStream in = this.getClass().getResourceAsStream("/prodKeyStore.jks");

        //char[] passphrase = password.toCharArray();
        // First initialize the key and trust material.
        KeyStore ks = KeyStore.getInstance("JKS");
        ks.load(in, "lP9Ow1uYXZr9zgt6".toCharArray());
        SSLContext sslContext = SSLContext.getInstance("TLS");

        //****************Client side specific*********************
        // TrustManager's decide whether to allow connections.
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
        tmf.init(ks);
        sslContext.init(null, tmf.getTrustManagers(), null);        
        //****************Client side specific*********************

        SSLEngine engine = sslContext.createSSLEngine();
        engine.setUseClientMode(true);
        return engine;
    } catch(Exception e) {
        throw new RuntimeException("Could not create SSLEngine", e);
    }
}

Далее, я собираюсь попытаться выяснить, как включить отладку для обмена ssl и посмотреть, поможет ли это. В настоящее время я не понимаю, почему это не работает.

OUCH, журналы отладки указывают на это

javax.net.ssl|DEBUG|21|httpclient2|2020-02-18 08:13:05.095 MST|CertificateMessage.java:358|Consuming server Certificate handshake message (
"Certificates": [
  "certificate" : {
   "version"            : "v3",
   "serial number"      : "00 90 76 89 18 E9 33 93 A0",
   "signature algorithm": "SHA256withRSA",
   "issuer"             : "CN=invalid2.invalid, OU="No SNI provided; please fix your client."",
   "not before"         : "2014-12-31 17:00:00.000 MST",
   "not  after"         : "2029-12-31 17:00:00.000 MST",
   "subject"            : "CN=invalid2.invalid, OU="No SNI provided; please fix your client."",
   "subject public key" : "RSA",
   "extensions"         : [

, так что что-то напортачило, но пока не уверен, что. Это jdk8. Пока не знаю, как это исправить.

спасибо, Дин

1 Ответ

0 голосов
/ 18 февраля 2020

Оказалось, что одна строка неверна, и это должно быть

SSLEngine engine = sslContext.createSSLEngine(host, port);

, и тогда все работает!

...