Project quarkus-mutual-tls-demo available on GitHub
演示项目,该项目显示了如何在Quarkus Server和Quarkus客户端应用程序上配置传输层安全性(TLS)。
此演示有两个应用程序:服务器和客户端。
首先,我解释了https
,tls
和mutual tls
的概念。
然后,我执行了一些测试,逐步显示我们如何配置以及当我们不正确配置应用程序时发生的问题是什么。
指数
概念
https
https代表超文本传输协议安全,该协议用于在Web浏览器(或其他客户端)和Web服务器之间建立安全且加密的连接。
当您使用HTTPS连接到网站时,浏览器和服务器交换加密密钥以建立安全连接。这样可以确保对客户端和服务器之间传输的任何数据进行加密和保护。
要估算HTTPS连接,服务器必须具有服务器证书。客户端访问服务器时,它将接收服务器证书,并检查此证书是否有效并由受信任证书机构(CA)发行。
TLS
传输层安全性(TLS)是一种加密协议,旨在通过计算机网络提供通信安全性。该协议被广泛用于电子邮件,即时消息传递和语音IP等应用程序,但在中使用HTTPS 仍然是最公开的。 2
运输层安全性(TLS)证书最常称为SSL,或数字证书是安全互联网的基础。 TLS/SSL证书通过加密在浏览器,您访问的网站和网站服务器之间发送的数据来保护Internet连接。他们确保数据是私人传输的,没有修改,丢失或盗窃。 3
相互tls 在客户端需要从服务器进行识别并且服务器也需要从客户端识别时发生。
证书生成
让我们生成服务器和客户端证书。
然后,我们将创建一个包含所有客户端证书的单个密钥库。
文件已经在项目上,如果您不执行keytool
命令,请首先删除文件。
在项目的根文件夹上执行以下命令。
服务器证书
$ keytool -genkeypair -storepass server-password -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -validity 365000 -keystore server/server-keystore.jks
客户“”证书
$ keytool -genkeypair -storepass client-a-password -keyalg RSA -keysize 2048 -dname "CN=client" -alias client -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -validity 365000 -keystore client/client-a-keystore.jks
客户“ B”证书
$ keytool -genkeypair -storepass client-b-password -keyalg RSA -keysize 2048 -dname "CN=client" -alias client-b -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -validity 365000 -keystore client/client-b-keystore.jks
创建服务器TrustStore
创建包含所有客户端密钥库的服务器信任商店文件。
生成服务器信任商店文件:
$ keytool -genkeypair -storepass authorized-clients-password -keyalg RSA -keysize 2048 -dname "CN=client" -alias authorized-clients -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -validity 365000 -keystore server/server-truststore-clients.jks
将客户端“ A”添加到服务器TrustStore:
$ keytool -importkeystore -srckeystore client/client-a-keystore.jks -srcstorepass client-a-password -destkeystore server/server-truststore-clients.jks -deststorepass authorized-clients-password
将客户端“ B”添加到服务器TrustStore:
$ keytool -importkeystore -srckeystore client/client-b-keystore.jks -srcstorepass client-b-password -destkeystore server/server-truststore-clients.jks -deststorepass authorized-clients-password
创建客户端信任库
$ cp server/server-keystore.jks client/client-truststore.jks
测试 - 带证书和客户端的服务器,未配置信任店
在此Cenario中,服务器仅接受HTTPS连接,但是服务器证书中不存在于客户端信任证书授权控制中。
在服务器端启用TL:
# Disallowing http access
quarkus.http.insecure-requests=disabled
# Configure https port
quarkus.http.ssl-port=8445
# Server Certificate
quarkus.http.ssl.certificate.key-store-file=./server-keystore.jks
quarkus.http.ssl.certificate.key-store-password=server-password
启动服务器:
- 输入server folder
- 执行
$ ./mvnw quarkus:dev
来自Quarkus客户的测试
开始客户端:
- 输入client folder
- 执行
$ ./mvnw quarkus:dev
执行消耗服务器端点的客户端端点:
$ curl localhost:8080/hello
尝试从客户端访问此端点而没有信任存储配置,我们会收到此错误:
jakarta.ws.rs.ProcessingException: javax.net.ssl.SSLHandshakeException: Failed to create SSL connection
...
Caused by: javax.net.ssl.SSLHandshakeException: Failed to create SSL connection
at io.vertx.core.net.impl.ChannelProvider$1.userEventTriggered(ChannelProvider.java:127)
... 25 more
Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
...
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
...
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
从卷发进行测试
$ curl https://localhost:8445
curl: (60) SSL certificate problem: self-signed certificate
More details here: https://curl.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
从卷曲中测试允许不安全的服务器连接
$ curl -k https://localhost:8445/hello
Hello from server
测试 - 带有证书的服务器,并配置了带有信托店的客户端
配置客户端信任店:
# Rest client specific Trust Store
quarkus.rest-client.server-api.trust-store=./client-truststore.jks
quarkus.rest-client.server-api.trust-store-password=server-password
来自Quarkus客户的测试
开始客户端:
- 输入client folder
- 执行
$ ./mvnw quarkus:dev
执行消耗服务器端点的客户端端点:
$ curl localhost:8080/hello
Hello from server
测试 - 具有共同TLS和客户端的服务器不告知身份
包括需要客户标识(quarkus.http.ssl.client-auth
)和服务器的信托店,这是服务器将信任的身份:
# Disallowing http access
quarkus.http.insecure-requests=disabled
# Configure https port
quarkus.http.ssl-port=8445
# Server Certificate
quarkus.http.ssl.certificate.key-store-file=./server-keystore.jks
quarkus.http.ssl.certificate.key-store-password=server-password
# Require client identification
quarkus.http.ssl.client-auth=required
quarkus.http.ssl.certificate.trust-store-file=./server-truststore-clients.jks
quarkus.http.ssl.certificate.trust-store-password=authorized-clients-password
启动服务器:
- 输入server folder
- 执行
$ ./mvnw quarkus:dev
来自Quarkus客户的测试
开始客户端:
- 输入client folder
- 执行
$ ./mvnw quarkus:dev
执行消耗服务器端点的客户端端点:
$ curl localhost:8080/hello
io.netty.handler.codec.DecoderException: javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate
...
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate
从卷发进行测试
$ curl -k https://localhost:8445
curl: (56) OpenSSL SSL_read: error:0A000412:SSL routines::sslv3 alert bad certificate, errno 0
测试 - 具有共同TLS的服务器,客户通知其证书
添加客户端证书:
# Rest client specific Trust Store
quarkus.rest-client.server-api.trust-store=./client-truststore.jks
quarkus.rest-client.server-api.trust-store-password=server-password
# Rest Client specific Key Store
quarkus.rest-client.server-api.key-store=./client-a-keystore.jks
quarkus.rest-client.server-api.key-store-password=client-a-password
开始客户端:
- 输入client folder
- 执行
$ ./mvnw quarkus:dev
执行消耗服务器端点的客户端端点:
$ curl localhost:8080/hello
Hello from server
您可以添加服务器信托店里的任何客户端密钥库,即client-a-keystore.jks (client-a-password)
或client-b-keystore.jks (client-b-password)
。
学分
https://quarkus.io/guides/security-authentication-mechanisms-concept#mutual-tls
https://quarkus.io/blog/quarkus-mutual-tls/
https://quarkus.io/guides/http-reference