ssl新闻资讯

文档中心

Java鍒朵綔HTTPS鍙屽悜璇佷功浠庡師鐞嗗埌瀹炴垬璇﹁В

时间 : 2025-09-27 16:21:45浏览量 : 3

什么是HTTPS双向证书?

2Java鍒朵綔HTTPS鍙屽悜璇佷功浠庡師鐞嗗埌瀹炴垬璇﹁В

想象一下你走进一家高档会所,保安不仅要检查你的会员卡(客户端证书),还要向你展示他们的官方认证(服务器证书),这就是HTTPS双向认证(mTLS)的日常版比喻。与普通HTTPS(单向认证)不同,双向认证要求客户端和服务器互相验证身份,安全性更高。

典型应用场景

1. 银行系统与ATM机的通信

2. IoT设备与云平台的认证

3. 企业内部微服务间的安全调用

4. API网关对客户端的严格鉴权

证书制作全流程

1. 准备根证书(自签名CA)

```java

// 使用KeyTool生成CA根证书

keytool -genkeypair \

-alias rootCA \

-keyalg RSA \

-keysize 2048 \

-validity 3650 \

-keystore ca.jks \

-storepass 123456 \

-keypass 123456 \

-dname "CN=MyRootCA,OU=Security,O=MyCompany,L=Beijing,C=CN" \

-ext bc:c

```

这相当于创建了一个"公安局",后续所有"身份证"(证书)都由它来颁发。`-ext bc:c`参数指定这是CA证书。

2. 签发服务器证书

// 生成服务器密钥对和CSR

-alias server \

-keystore server.jks \

...

// 生成CSR文件

keytool -certreq \

-file server.csr

// CA签署服务器证书

keytool -gencert \

-infile server.csr \

类比过程:公司(服务器)先准备材料(CSR),然后向公安局(CA)申请营业执照(服务器证书)。

3. 签发客户端证书

// Windows用户可以用这个命令转换格式

openssl pkcs12 -export

-in client.crt

...

客户端证书就像是员工工牌,每个接入系统的客户端都需要独有的身份凭证。

Java代码实现示例

Spring Boot服务端配置

@Configuration

public class SSLConfig {

@Value("${server.ssl.key-store}")

private String keyStorePath;

@Bean

public ServletWebServerFactory servletContainer() {

TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();

tomcat.addAdditionalTomcatConnectors(createSslConnector());

return tomcat;

}

private Connector createSslConnector() {

// SSL配置细节...

connector.setProperty("sslVerifyClient", "require"); //强制要求客户端证书

}

关键点:`sslVerifyClient`设置为require表示强制双向认证。

OkHttp客户端实现

OkHttpClient client = new OkHttpClient.Builder()

.sslSocketFactory(

sslContext.getSocketFactory(),

(X509TrustManager)trustManagers[0])

.hostnameVerifier((hostname, session) -> true)

.build();

注意:生产环境应该严格校验主机名,这里简化了验证逻辑。

HTTPS抓包调试技巧

双向认证后常规抓包工具会失效,需要:

1. 导出客户端PKCS12证书

```bash

keytool -importkeystore

...

```

2. 在Charles/Wireshark中导入

File -> Import -> PKCS12...

3. 添加SSL代理配置

```properties

javax.net.debug=ssl,handshake

Nginx反向代理配置示例

server {

listen 443 ssl;

ssl_certificate /path/to/server.crt;

ssl_certificate_key /path/to/server.key;

ssl_client_certificate /path/to/ca.crt;

信任的CA

不同验证强度可选:

off|on|optional|optional_no_ca

if ($ssl_client_verify != SUCCESS) {

return 403;

自定义验证失败处理

Android特殊处理方案

Android7+开始不再信任用户级CA证书:

1. Network Security Config:

```xml

????

????????example.com

????????

????????????

????????

????

2. 代码中动态加载:

```java

KeyStore ks = KeyStore.getInstance("BKS");

InputStream is = context.getResources().openRawResource(R.raw.client);

ks.load(is, "password".toCharArray());

CI/CD自动化方案建议

1. Vault PKI引擎动态签发短期有效证书:

vault write pki/issue/my-role

????common_name="service1.prod"

????ttl="24h"

2. Cert-Manager+K8S自动轮换:

```yaml

apiVersion: cert-manager.io/v1alpha2

kind: Certificate

spec:

????secretName: tls-secret

????duration:2160h

90天有效期

????renewBefore:360h

15天前续期

????issuerRef:

??????name: vault-issuer

??????kind: Issuer

TLS性能优化要点

1. 会话复用(减少握手开销):

SSLContext.setSessionCacheSize(1024);

SSLContext.setSessionTimeout(3600);

2. OCSP装订(避免CRL检查延迟):

-Djdk.tls.server.enableStatusRequestExtension=true

3. TLS1.3优先(减少RTT时间):

jdk.tls.client.protocols=TLSv1.3,TLSv1.2

FAQ常见问题排查指南

Q:收到`javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate`

A:按顺序检查:

1)客户端是否发送了正确的证书链(包含中间CA)

2)服务端信任库是否包含签发客户端证书的根CA

Q:Android报`CertPathValidatorException`

A:通常是中间CA缺失导致,使用这个命令查看完整链:

openssl s_client --showcerts --connect example.com:443

TAG:java制作https双向证书,java ssl双向认证,https双向认证证书生成,java 生成证书