Jetty 9 - Включите сшивание OCSP для сертификата, подтвержденного доменом
У меня есть некоторые проблемы с включением сшивания OCSP в Jetty 9, и я действительно надеюсь, что кто-то может помочь мне здесь... надеюсь!
Для своих тестов я купил SSL-сертификат у PositiveSSL (Comodo), который дал мне действительный / доверенный сертификат. Домен в этом примере - "dev.mydomain.com", и он просто будет указывать на мой локальный ip (127.0.0.1).
Затем я преобразовал предоставленный сертификат в формат хранилища ключей Java.
# Convert certificate to pkcs12
openssl pkcs12 -export -out dev.mydomain.com.pkcs12 -inkey dev.mydomain.com.key -in dev_mydomain_com.crt
# Create java keystore
keytool -importkeystore -srckeystore dev.mydomain.com.pkcs12 -srcstoretype pkcs12 -destkeystore dev.mydomain.com.keystore -deststoretype JKS
Это упрощенный код Java, который я использовал для создания сервера Jetty, активации сертификата, прослушивания порта 443 (https) и теоретически активации OCSP:
Server _server = new Server(); // org.eclipse.jetty.server.Server
HttpConfiguration httpsConfig = new HttpConfiguration();
HttpConnectionFactory http1 = new HttpConnectionFactory(httpsConfig);
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setKeyStorePath("dev.mydomain.com.keystore");
sslContextFactory.setKeyStorePassword("mypass");
sslContextFactory.setKeyManagerPassword("mypass");
// sslContextFactory.setValidateCerts(true); // tested
sslContextFactory.setEnableOCSP(true);
SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory, http1.getProtocol());
// SSL Connector
ServerConnector sslConnector = new ServerConnector(_server, ssl, http1);
sslConnector.setHost("127.0.0.1");
sslConnector.setPort(443);
_server.addConnector(sslConnector);
_server.start();
_server.join();
При запуске Java VM я также включаю следующие системные свойства:
Security.setProperty("ocsp.enable", "true");
System.setProperty("jdk.tls.server.enableStatusRequestExtension", "true");
System.setProperty("com.sun.net.ssl.checkRevocation", "true");
После нескольких попыток я попытался также импортировать цепочку сертификатов в хранилище ключей, но это никак не повлияло на результат.
keytool -import -trustcacerts -alias ca -file COMODORSAAddTrustCA.crt -keystore dev.mydomain.com.keystore
keytool -import -trustcacerts -alias dv -file COMODORSADomainValidationSecureServerCA.crt -keystore dev.mydomain.com.keystore
keytool -import -trustcacerts -alias te -file AddTrustExternalCARoot.crt -keystore dev.mydomain.com.keystore
Чтобы проверить, правильно ли был включен OCSP, я использовал инструмент под названием sslyze, но что бы я ни пытался сделать, ответ на OCSP всегда был отрицательным:
OCSP Stapling - NOT SUPPORTED - Server did not send back an OCSP response
Вот полный вывод sslyze:
C:\Tools\sslyze-1_4_1>sslyze --certinfo dev.mydomain.com:443
AVAILABLE PLUGINS
-----------------
OpenSslCipherSuitesPlugin
RobotPlugin
CertificateInfoPlugin
FallbackScsvPlugin
SessionRenegotiationPlugin
HeartbleedPlugin
CompressionPlugin
OpenSslCcsInjectionPlugin
SessionResumptionPlugin
HttpHeadersPlugin
CHECKING HOST(S) AVAILABILITY
-----------------------------
dev.mydomain.com:443 => 127.0.0.1
SCAN RESULTS FOR DEV.MYDOMAIN.COM:443 - 127.0.0.1
------------------------------------------------
* Certificate Information:
Content
SHA1 Fingerprint: 7c398c59bac3a231efc9823c6958a7bc711bfc0e
Common Name: dev.mydomain.com
Issuer: COMODO RSA Domain Validation Secure Server CA
Serial Number: 103185809289011988533713848804380317148
Not Before: 2018-04-18 00:00:00
Not After: 2019-04-18 23:59:59
Signature Algorithm: sha256
Public Key Algorithm: RSA
Key Size: 2048
Exponent: 65537 (0x10001)
DNS Subject Alternative Names: ['dev.mydomain.com', 'www.dev.mydomain.com']
Trust
Hostname Validation: OK - Certificate matches dev.mydomain.com
Android CA Store (8.1.0_r9): FAILED - Certificate is NOT Trusted: unable to get local issuer certificate
iOS CA Store (11): FAILED - Certificate is NOT Trusted: unable to get local issuer certificate
macOS CA Store (High Sierra): FAILED - Certificate is NOT Trusted: unable to get local issuer certificate
Mozilla CA Store (2018-01-14): FAILED - Certificate is NOT Trusted: unable to get local issuer certificate
Windows CA Store (2018-02-09): FAILED - Certificate is NOT Trusted: unable to get local issuer certificate
Symantec 2018 Deprecation: OK - Not a Symantec-issued certificate
Received Chain: dev.mydomain.com
Verified Chain: ERROR - Could not build verified chain (certificate untrusted?)
Received Chain Contains Anchor: ERROR - Could not build verified chain (certificate untrusted?)
Received Chain Order: OK - Order is valid
Verified Chain contains SHA1: ERROR - Could not build verified chain (certificate untrusted?)
Extensions
OCSP Must-Staple: NOT SUPPORTED - Extension not found
Certificate Transparency: WARNING - Only 2 SCTs included but Google recommends 3 or more
OCSP Stapling
NOT SUPPORTED - Server did not send back an OCSP response
SCAN COMPLETED IN 0.78 S
------------------------
Извините за длинный пост, но я постарался предоставить как можно больше подробностей!
Спасибо! Yuvi
1 ответ
На самом деле Jetty мало что делает со значениями конфигурации OSCP.
3 ключевых значения конфигурации...
1. Включить OCSP
SslContextFactory.setEnableOCSP(true)
Эта конфигурация просто устанавливает ocsp.enable
JVM охранное имущество.
2. Установите URL-адрес ответчика OCSP
SslContextFactory.setOcspResponderURL(ocspResponderURL)
Если setEnableOSCP(true)
и OcspResponderURL
установлен, то ocsp.responderURL
Установлено свойство безопасности JVM.
Код причала
if (_enableOCSP)
{
// Enable On-Line Certificate Status Protocol (OCSP) support
Security.setProperty("ocsp.enable", "true");
if (_ocspResponderURL != null)
{
// Override location of OCSP Responder
Security.setProperty("ocsp.responderURL", _ocspResponderURL);
}
}
Эти 2 являются конфигурациями уровня JVM, и на данный момент ответственность за добавление OCSP к согласованию TLS / SSL лежит на JVM.
3. Пользовательский сертификат валидатора
SslContextFactory.setValidateCerts(true)
Если это установлено, то значения двух других передаются в пользовательскую Eclipse Jetty CertificateValidator
,
Больше кода причала
if (isValidateCerts())
{
CertificateValidator validator = new CertificateValidator(trustStore, crls);
validator.setMaxCertPathLength(getMaxCertPathLength());
validator.setEnableCRLDP(isEnableCRLDP());
validator.setEnableOCSP(isEnableOCSP());
validator.setOcspResponderURL(getOcspResponderURL());
validator.validate(keyStore, x509C);
}
Это серверный компонент, который только проверяет сертификаты, которые сервер будет использовать при запуске. Это происходит только один раз, когда загружается хранилище ключей / хранилище доверенных сертификатов.