- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Tomcat v10.0.x 中使用 HSM 中的 key 来使用 TLS。
tl; dr:请参阅下面的答案以及所有步骤。剩余部分留在下面以允许搜索算法找到它。
我想知道的是,a:(事物的宏伟计划)应该可行,并且 b:(细节)我在 server.xml 连接器中错过了什么?
<Connector port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
port="8443"
SSLEnabled="true"
scheme="https"
secure="true"
clientAuth="false"
>
<SSLHostConfig>
protocols="TLSv1.2"
>
<Certificate
type="RSA"
certificateKeystoreType="PKCS11"
certificateKeystoreFile=""
certificateKeystoreProvider="SunPKCS11-CryptoServer"
certificateKeystorePassword="123456"
/>
</SSLHostConfig>
</Connector>
当 Tomcat 启动时,我得到各种 NullPointerExceptions(取决于连接器中的内容)。例子:
27-Oct-2021 10:03:42.669 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["https-openssl-nio-443"]
27-Oct-2021 10:03:42.869 WARNING [main] org.apache.tomcat.util.net.openssl.OpenSSLContext.init Error initializing SSL context
java.lang.NullPointerException: Cannot read the array length because "src" is null
和
27-Oct-2021 15:16:20.406 WARNING [main] org.apache.tomcat.util.net.openssl.OpenSSLContext.init Error initializing SSL context
java.lang.NullPointerException
at java.base/java.util.Base64$Encoder.encode(Base64.java:289)
at java.base/java.util.Base64$Encoder.encodeToString(Base64.java:343)
at org.apache.tomcat.util.net.openssl.OpenSSLContext.addCertificate(OpenSSLContext.java:408)
at org.apache.tomcat.util.net.openssl.OpenSSLContext.init(OpenSSLContext.java:250)
底层 HSM 已正确配置,并且在插槽 0 中具有可用的 key /证书。SunPKCS11-CryptoServer 确实适用于 key 工具。当我启动 tomcat 时,HSM 日志文件中填充了我希望看到的信息。
curl -k -v --tlsv1.2 https://127.0.0.1:8080/
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* error:1408F10B:SSL routines:ssl3_get_record:wrong version number
* stopped the pause stream!
* Closing connection 0
curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number
和
curl -k -v --tlsv1.2 https://127.0.0.1:8443
* Rebuilt URL to: https://127.0.0.1:8443/
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to 127.0.0.1:8443
* stopped the pause stream!
* Closing connection 0
curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to 127.0.0.1:8443
在日志中,我得到“在方法名称中发现无效字符”和十六进制值:
27-Oct-2021 15:22:58.552 INFO [http-nio-8080-exec-1] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header
Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in method name [0x..0x..0x.. ...]. HTTP method names must be tokens
尝试使用 nio 和 nio2。
sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
现在,Tomcat 无一异常(exception)地启动了。但是,当我尝试 curl 时:
curl -k -v --tlsv1.2 https://127.0.0.1:8443
* Rebuilt URL to: https://127.0.0.1:8443/
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS alert, Server hello (2):
* error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error
* stopped the pause stream!
* Closing connection 0
curl: (35) error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error
curl -k -v --tlsv1.3 https://127.0.0.1:8443
* Rebuilt URL to: https://127.0.0.1:8443/
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Unknown (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS Unknown, Unknown (21):
* TLSv1.3 (IN), TLS alert, Server hello (2):
* error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
* stopped the pause stream!
* Closing connection 0
curl: (35) error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
Tomcat 日志没有显示任何内容,有趣的是,HSM 日志文件没有显示任何新数据。我希望看到对 HSM 的调用是 DH key 协议(protocol)的一部分。
An error occurred during a connection to 127.0.0.1:8443. SSL peer was unable to negotiate an acceptable set of security parameters.
Error code: SSL_ERROR_HANDSHAKE_FAILURE_ALERT
并且, openssl s_client -connect localhost:8443,以防万一。这看起来像是可以协商的配置错误;虽然我可以确定问题,但我不确定在哪里需要进行哪些更改。
---
No client certificate CA names sent
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 1324 bytes and written 307 bytes
Verification error: self signed certificate
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 3096 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 18 (self signed certificate)
---
我通过添加在 Tomcat 实例中启用了 ssl:handshake
set "JAVA_OPTS=%JAVA_OPTS% -Djavax.net.debug=ssl:handshake"
到 {安装}\bin\catalina.bat。
javax.net.ssl|DEBUG|17|https-jsse-nio-8443-exec-1|2021-10-28 16:22:21.925 \
PDT|CertificateMessage.java:262|Produced server Certificate handshake message (
"Certificates": [
"certificate" : {
"version" : "v3",
"serial number" : "00 EB 48 4B 73 73 35 C6 D8",
"signature algorithm": "SHA256withRSA",
"issuer" : "CN=localhost, OU=SysEng, O=UInc, L=Ca, S=Ca, C=US",
"not before" : "2021-10-28 16:20:07.000 PDT",
"not after" : "2022-01-26 15:20:07.000 PST",
"subject" : "CN=localhost, OU=SysEng, O=UInc, L=Ca, S=Ca, C=US",
"subject public key" : "RSA",
"extensions" : [
{
ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 91 84 8C 3A 49 C6 2E E4 95 D2 8F 84 97 34 2C 4E ...:I........4,N
0010: F2 B9 D2 D0 ....
]
]
}
]}
]
)
javax.net.ssl|ERROR|17|https-jsse-nio-8443-exec-1|2021-10-28 16:22:21.945 \
PDT|TransportContext.java:316|Fatal (INTERNAL_ERROR): Unsupported signature \
algorithm: rsa_pss_rsae_sha256 (
"throwable" : {
java.security.InvalidKeyException: RSA key must be at least 512 bytes
at jdk.crypto.cryptoki/sun.security.pkcs11.P11PSSSignature.checkKeySize(P11PSSSignature.java:352)
at jdk.crypto.cryptoki/sun.security.pkcs11.P11PSSSignature.engineInitSign(P11PSSSignature.java:480)
F:\Tomcat\apache-tomcat-10.0.12\bin>cxitool dev=3001@127.0.0.1 LogonPass=USR_0000,ask Group=* ListKeys
idx algo size type group name spec
--------------------------------------------------------------------------------------
1 RSA 3072 prv SLOT_0000 6
2 X509 0 cert SLOT_0000 7
跟进最优秀的 dave_thompson 的最新评论,我重新生成了 key ,因为我无法弄清楚为什么 3072 位 key 在 openssl 输出中报告 3096。我生成了一个 4096 位 key (
并修复了证书 -dname 中的问题),然后它就起作用了。
最佳答案
Utimaco CryptoServer 的步骤:
将 HSM 配置为使用 PKCS11 R2 或 R3,具体取决于固件版本。可以让 R2 和 R3 配置“实时”并在 server.xml 文件中选择一个。
name = CryptoServerR2
description = SunPKCS11 provider offload to CryptoServer PKCS11 R2 library
library = {path_to}\cs_pkcs11_R2.dll
# library = {path_to}\cs_pkcs11_R3.dll
# Set slotListIndex to the slot (SLOT_xxxx), where SLOT_0003 would be 3
slotListIndex = 0
attributes(*,*,CKK_EC) = {
CKA_DERIVE = true
}
attributes(generate,*,CKK_GENERIC_SECRET) = {
CKA_SENSITIVE = false
CKA_EXTRACTABLE = true
}
{path_to} 将根据您用于安装工具的安装程序版本而改变。
somepath> keytool -genkey -keyalg RSA -keysize 4096 -keystore NONE -storetype PKCS11 \
-storepass {passphrase} -providername SunPKCS11-CryptoServerR2 -alias tomcat_demo \
-dname "CN=localhost,OU=SysEng,O=UInc,L=Locality,S=StateOrProvince,C=Country"
此时,Java 被配置为通过安全提供程序列表使用 PKCS11 库。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
port="8443"
SSLEnabled="true"
maxThreads="150"
scheme="https"
secure="true"
clientAuth="false"
>
<SSLHostConfig
protocols="TLSv1.2"
ciphers="TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
TLS_RSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_AES_128_CBC_SHA256,
TLS_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_RSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
TLS_RSA_WITH_AES_256_CBC_SHA256,
TLS_RSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
>
<Certificate
type="RSA"
certificateKeystoreType="PKCS11"
certificateKeystoreFile=""
certificateKeystoreProvider="SunPKCS11-CryptoServerR2"
certificateKeystorePassword="{passphrase}"
certificateKeyAlias="tomcat_demo"
/>
</SSLHostConfig>
</Connector>
使用 startup.bat 脚本启动 Tomcat 并观察输出中的异常。
curl -k -v --tlsv1.2 https://localhost:8443
关于ssl - Tomcat 10 使用 HSM 作为 TLS 的 PKCS11 keyStore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69746244/
我有一些私钥存储在 HSM 中,但没有公钥。我想通过PKCS11接口(interface)获取对应的公钥。 如果私钥是RSA key ,我可以从CKA_MODULUS中提取模数,从CKA_PUBLIC
收到CKR_GENERAL_ERROR当应用程序尝试打开与 H/W HSM 的连接时。 详细的错误是: 50004-Crypto API could not be open. Caused by: x
HSM 服务器和客户端设置已在我这边完成,我的问题是如何在没有 HSM 客户端的情况下与 HSM 服务器进行通信以通过 java 应用程序访问 Luna key 存储,是否有其他方法可以在没有客户端的
我想简要了解硬件/主机安全模块中的区域主 key 或区域控制主 key 。有人可以解释一下吗? 最佳答案 区域主 key (ZMK)只是另一个 Des key 。它用于在 HSM 之间传输 key 。
使用 HSM 命令 A0(生成 key ),我得到以下响应。 HEADA100U7D4213E0422F4E08E9455D9837E09FDDRA0072B1TX00S000073C35FF96F7
我在互联网上发现 HSM 是存储 key 的最佳位置,但我还有很多悬而未决的问题。服务器、HSM 和数据库之间如何进行交互?。是不是就像服务器从 HSM 检索 key 来解密数据库中的数据一样?如果我
我试图了解如何使用终端将 hsm 和 key 链接到交易。我应该开发一个身份验证服务器,它从终端接收交易并解析它们以获取不同的数据。但我不明白的是如何使用 hsm 来保护数据。 最佳答案 首先您必须了
我正在研究 HSM,我有一个问题。 在 HSM(对于所有系统)中,是否只有一种当前状态?例如; 在我的项目中,有两种用户类型:普通用户和技术人员用户。它们之间没有相同之处。普通用户可以随时登录系统和注
我正在尝试使用 python 代码向 HSM (Thales paysheild 9000) 发送命令。但我从代码中得到的响应并不符合预期。 Input: HEADJA12345678912306 #
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我引用以下文档: How to generate and transfer HSM-protected keys for Azure Key Vault 先决条件之一是: Thales HSM、智能卡
我工作并完成了一个 PKI 项目,该项目使用 HSM 来生成 - 存储 key 和执行加密功能。我使用 PKCS#11 与我们的应用程序交互以进行签名/验证和加密/解密。我们的平台是windows。
我引用以下文档: How to generate and transfer HSM-protected keys for Azure Key Vault 先决条件之一是: Thales HSM、智能卡
这正是我想知道的。基于云的 HSM 很昂贵,我需要确定要支付的费用。 最佳答案 主要是公钥加密。 HSM 包含 key 对,这些 key 对可以链接回受信任的公共(public)根,这与 SSL/TL
我正在连接一个 HSM,它正在生成并使用以太坊标准 (secp256k1) 进行签名。我正在使用一个名为 Graphene 的包与 HSM 连接。我使用其“pointEC”属性提取公钥:0xc87c1
此代码块正在加载 cryptoki.so 库并检索插槽信息。这是获取插槽编号中的对象列表。 0. 我不需要访问所有的键来执行一些功能,只需要一个特定的键对。有没有办法通过使用标签名称、对象 ID 或句
我有一个 Thales nShield HSM,其中创建了一个(CKA_SENSATIVE,假)AES key ,我想提取该 key ,但是我根本不知道如何在 java 中执行此操作。我的 key 创
AWS 似乎允许我们将 AWS Cloud HSM 作为提供商,请参阅 here和here Security.addProvider(new com.cavium.provider.CaviumPro
所以我正在编写一个需要使用客户端证书(相互身份验证)向服务器进行身份验证的应用程序。客户端证书 key 存储在 HSM(Gemalto 的)中。我将 OpenSSL 与 Luna 客户端集成,但请求模
我正在尝试从我的计算机访问 Safenet HSM,我将我的计算机添加到客户端并将 pem 文件发送到 HSM,就在这里。问题是当我输入“vtl verify”时,因为它启动了以下错误: SSL Co
我是一名优秀的程序员,十分优秀!