Выдача сертификата Sagemaker у Kubernetes

Я создал Docker контейнер, который использует Sagemaker через Java SDK. Этот контейнер развернут в кластере k8s с несколькими репликами.

Контейнер делает простые запросы к Sagemaker, чтобы перечислить некоторые модели, которые мы обучили и развернули. Однако сейчас у нас проблемы с некоторыми сертификатами Java. Я новичок в k8s и сертификатах, поэтому буду признателен, если вы поможете решить проблему.

Вот некоторые следы из журнала, когда он пытается перечислить конечные точки:

org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:394)
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:353)
    at com.amazonaws.http.conn.ssl.SdkTLSSocketFactory.connectSocket(SdkTLSSocketFactory.java:132)
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:141)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.amazonaws.http.conn.ClientConnectionManagerFactory$Handler.invoke(ClientConnectionManagerFactory.java:76)
    at com.amazonaws.http.conn.$Proxy67.connect(Unknown Source)
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55)
    at com.amazonaws.http.apache.client.impl.SdkHttpClient.execute(SdkHttpClient.java:72)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1236)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1056)
    ... 70 common frames omitted
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:397)
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:302)
    at sun.security.validator.Validator.validate(Validator.java:262)
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1621)
    ... 97 common frames omitted
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:392)
    ... 103 common frames omitted 

3 ответа

Решение

Я думаю, что нашел ответ на мою проблему. Я установил еще один кластер k8s и развернул там контейнер. Они работают нормально и проблем с сертификатами не возникает. Исследуя больше, я заметил, что у них были некоторые проблемы с разрешением DNS на первом кластере k8s. Фактически, контейнеры с проблемами сертификатов не могли, например, пропинговать google.com. Я исправил проблему с DNS, не полагаясь на core-dns и установив конфигурацию DNS в файле deploy.yaml. Я не уверен, чтобы понять, почему именно, но это, кажется, решило проблему с сертификатом.

Получаемое сообщение об ошибке возникает, когда Java не знает о корневом сертификате, возвращенном конечной точкой TLS. Это часто происходит, если вы меняете доступные корневые сертификаты.

По https://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html:

"If a truststore named <java-home>/lib/security/jssecacerts is found, it is used. 
If not, then a truststore named <java-home>/lib/security/cacerts is searched for and used (if it exists).
Finally, if a truststore is still not found, then the truststore managed by the TrustManager will be a new empty truststore."

Openssl - хороший инструмент для отладки таких проблем с сертификатами. Вы можете использовать следующую команду для получения сертификата, возвращенного конечной точкой. Это может помочь вам определить, как выглядит цепочка сертификатов.

openssl s_client -showcerts -connect www.example.com:443 </dev/null

Вы можете просмотреть список сертификатов, которые Java знает об использовании keytool, утилиты, поставляемой с JRE.

keytool -list -cacerts

Некоторые системные администраторы перезаписывают сертификаты по умолчанию, записывая альтернативный файл склада доверенных сертификатов в папку по умолчанию. В других случаях команды могут переопределить значение по умолчанию, используя системное свойство javax.net.ssl.trustStore.

Наконец, вы можете использовать утилиту jps, также поставляемую с JRE, чтобы увидеть системные свойства, установленные для работающего процесса Java.

jps -v

Скорее всего, это может быть связано с тем, что администратор добавил в вашу сеть какой-нибудь собственный путь сертификации SSL. Возможно, вы захотите проверить корневые сертификаты SSL, открыв любой защищенный веб-сайт в браузере и щелкнув ссылку "Безопасная" слева от адресной строки (по крайней мере, так оно и есть в Chrome) . Вы увидите всплывающее окно с информацией о сертификате и сертификации. Перейдите к его пути сертификата и посмотрите сертификат ROOT. Если это какой-то собственный сертификат, вам нужно добавить его в файл cacerts. Прочитайте эту ссылку для более подробной информации

Другие вопросы по тегам