Я хотел бы реализовать ssl-соединение, пара ключей RSA хранится в модуле безопасности оборудования (HSM) в Java.
Используя движок openssl pkcs11, я достиг TLS-соединения со следующей конфигурацией движка.
[openssl_def]
engines = engine_section
[engine_section]
pkcs11 = pkcs11_section
[pkcs11_section]
engine_id = pkcs11
MODULE_PATH = /home/ubuntu/Desktop/vendorlib.so
PIN = "123456"
init = 0
[req]
distinguished_name = test_name
[req_distinguished_name]
а затем я создаю сертификат, используя этот механизм, с помощью следующей команды, где ssl_key хранится в устройстве HSM.
OPENSSL_CONF=engine.conf openssl req -new -x509 -days 365 -subj '/CN=test/' -sha256 -config engine.conf -engine pkcs11 -keyform engine -key slot_2-label_ssl_key -out cert.pem
Я могу подтвердить сертификат и пару ключей с помощью следующих команд сервера и клиента openssl.
Для сервера:
OPENSSL_CONF=engine.conf openssl s_server -engine pkcs11 -keyform engine -key slot_2-label_ssl_key -cert cert.pem -accept 44330
Для клиента:
OPENSSL_CONF=engine.conf openssl s_client -connect localhost:44330 -engine pkcs11
Однако мне нужно, чтобы это соединение было установлено в соединении Vertx (3.81) Java 8.
Когда я смотрю документацию по vertx, там есть OpenSSLEngineOptions, который можно установить как serverOptions, но я не мог понять, где разместить такие параметры, как имя ключа, номер слота, идентификатор двигателя и т. Д. Фактически, OpenSSLEngineOptions имеет конструктор, который принимает JsonObject, но я не смог его найти образец для этого JsonObject.
Вот фрагмент кода, в котором я создаю экземпляр параметра Vertx ssl.
HttpServerOptions serverOptions = jerseyServerOptions.getServerOptions();
OpenSSLEngineOptions openSSLOptions = new OpenSSLEngineOptions();
serverOptions.setOpenSslEngineOptions(openSSLOptions);
serverOptions.setPort(1234);
serverOptions.setSsl(true);
String certCopy = "-----BEGIN CERTIFICATE-----
MIICMzCCAZygAwIBAgIJALiPnVsvq8dsMA0GCSqGSIb3DQEBBQUAMFMxCzAJBgNV
BAYTAlVTMQwwCgYDVQQIEwNmb28xDDAKBgNVBAcTA2ZvbzEMMAoGA1UEChMDZm9v
MQwwCgYDVQQLEwNmb28xDDAKBgNVBAMTA2ZvbzAeFw0xMzAzMTkxNTQwMTlaFw0x
ODAzMTgxNTQwMTlaMFMxCzAJBgNVBAYTAlVTMQwwCgYDVQQIEwNmb28xDDAKBgNV
BAcTA2ZvbzEMMAoGA1UEChMDZm9vMQwwCgYDVQQLEwNmb28xDDAKBgNVBAMTA2Zv
bzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAzdGfxi9CNbMf1UUcvDQh7MYB
OveIHyc0E0KIbhjK5FkCBU4CiZrbfHagaW7ZEcN0tt3EvpbOMxxc/ZQU2WN/s/wP
xph0pSfsfFsTKM4RhTWD2v4fgk+xZiKd1p0+L4hTtpwnEw0uXRVd0ki6muwV5y/P
+5FHUeldq+pgTcgzuK8CAwEAAaMPMA0wCwYDVR0PBAQDAgLkMA0GCSqGSIb3DQEB
BQUAA4GBAJiDAAtY0mQQeuxWdzLRzXmjvdSuL9GoyT3BF/jSnpxz5/58dba8pWen
v3pj4P3w5DoOso0rzkZy2jEsEitlVM2mLSbQpMM+MUVQCQoiG6W9xuCFuxSrwPIS
pAqEAuV4DNoxQKKWmhVv+J0ptMWD25Pnpxeq5sXzghfJnslJlQND
-----END CERTIFICATE-----";
PemKeyCertOptions pemKeyCertOptions = new PemKeyCertOptions().setCertValue(Buffer.buffer(certValue));
serverOptions.setPemKeyCertOptions(pemKeyCertOptions);
TL; DR; Как мы можем установить SSL-соединение в Vertx, когда закрытый ключ хранится только в HSM и не может быть извлечен?
Изменить: я нашел парсер jsonObject в конструкторе OpenSSLEngineOptions здесь. К сожалению, он читает только параметр sessionCacheEnabled.