国密配置

国密 / TLCP 配置指南 #

在政务、金融等信创场景中,要求使用国密(SM)系列算法进行 TLS 加密。Easysearch 基于 铜锁(Tongsuo) 提供国密 TLCP 双证书能力,支持 SM2/SM3/SM4 加密套件。

国密算法简介 #

算法类型对应国际算法用途
SM2非对称加密ECDSA / RSA数字签名、密钥交换
SM3哈希SHA-256完整性校验
SM4对称加密AES数据加密

国密 TLS 使用 SM2 证书 + SM4 加密 + SM3 哈希,组成完整的加密通信套件。


前置条件 #

条件说明
节点运行平台国密运行依赖 Tongsuo JNI 原生库;bin/easysearch 当前会按以下平台加载本地库:linux-x86_64 / linux-aarch64 / darwin-x86_64 / darwin-aarch64。若对应库缺失会启动失败
证书生成平台generate-tlcp-certs.sh 在 Linux 上要求系统安装 tongsuo 命令;macOS/其他平台优先使用 tongsuo,未安装时 fallback 到 openssl(需支持 SM2/SM3);若两者都不存在则脚本直接失败退出
安全模块需使用包含 modules/security 的发行包
协议推荐使用 TLSv1.3;如手工配置 TLCP 但运行环境不支持,会在启动时报错(不会自动回退)

Linux 安装 Tongsuo(宿主机) #

当你在 Linux 宿主机上执行 bin/generate-tlcp-certs.sh 时,需要系统可直接找到 tongsuo 命令。

# 1) 下载并解压 Tongsuo 8.4.0
cd /tmp
curl -fL https://github.com/Tongsuo-Project/Tongsuo/archive/refs/tags/8.4.0.tar.gz -o tongsuo-8.4.0.tar.gz
tar -xzf tongsuo-8.4.0.tar.gz
cd Tongsuo-8.4.0

# 2) 编译安装到 /opt/tongsuo
./config shared --prefix=/opt/tongsuo --openssldir=/opt/tongsuo/ssl
make -j"$(nproc)"
sudo make install_sw

# 3) 配置环境变量(全局)
sudo tee /etc/profile.d/tongsuo.sh >/dev/null <<'EOF'
TONGSUO_HOME=/opt/tongsuo
export PATH=$TONGSUO_HOME/bin:$PATH
export LD_LIBRARY_PATH="$TONGSUO_HOME/lib64:$TONGSUO_HOME/lib:${LD_LIBRARY_PATH:-}"
EOF

# 4) 使当前会话生效并验证
source /etc/profile.d/tongsuo.sh
command -v tongsuo
tongsuo version

如不使用 root,可改为安装到用户目录并将 PATH/LD_LIBRARY_PATH 写入用户 shell 配置。


证书生成 #

Easysearch 自带证书生成脚本,在发行包根目录执行:

bin/generate-tlcp-certs.sh /path/to/output "changeit"

第一个参数为输出目录,第二个参数为证书密码,第三个参数(可选)为证书 subject(默认 /C=IN/ST=FI/L=NI/O=ORG/OU=UNIT/CN=infini.cloud)。也可通过 DOMAIN 环境变量覆盖默认域名:

DOMAIN=my.company.com bin/generate-tlcp-certs.sh /path/to/output "changeit"

生成多节点证书时,可通过 NODE_NAMES_STR 传入空格分隔的节点名:

NODE_NAMES_STR="node1 node2 node3" bin/generate-tlcp-certs.sh /path/to/output "changeit"

脚本输出文件 #

TLCP 要求签名证书加密证书两套独立的密钥对(双证书体制),脚本会同时生成服务端和客户端的双证书:

文件说明
node1_sign.crt / node1_sign.key(及 nodeX_*节点签名证书与私钥(按节点生成)
node1_enc.crt / node1_enc.key(及 nodeX_*节点加密证书与私钥(按节点生成)
server_sign.crt / server_sign.key兼容文件,默认指向第一个节点签名证书副本
server_enc.crt / server_enc.key兼容文件,默认指向第一个节点加密证书副本
admin.crt / admin.key管理员客户端证书与私钥
client_sign.crt / client_sign.key客户端签名证书与私钥
client_enc.crt / client_enc.key客户端加密证书与私钥
ca.crt / ca.key根 CA 证书与私钥
sub_ca.crt / sub_ca.key中间 CA 证书与私钥
ca_chain.crt中间 CA + 根 CA 信任链
http-truststore-sm2.p12HTTP 层 PKCS12 Truststore
transport-truststore-sm2.p12Transport 层 PKCS12 Truststore
http-keystore-sm2.p12 / transport-keystore-sm2.p12空 PKCS12 Keystore 占位文件(兼容用途,不含 TLCP 双证书)

生成完成后,将输出目录中的证书文件复制到 Easysearch 的 config/ 目录。


配置方式(推荐:PEM 模式) #

TLCP 双证书配置使用 security.ssl.<层>.tlcp.* 前缀,分别指定签名(sign)和加密(enc)两套证书。

HTTP 层 #

# ---- 启用铜锁国密引擎 ----
security.ssl.use_tongsuo: true
security.ssl.http.enabled: true

# ---- TLCP 双证书(PEM 格式) ----
security.ssl.http.tlcp.sign_certificate: server_sign.crt
security.ssl.http.tlcp.sign_key: server_sign.key
security.ssl.http.tlcp.enc_certificate: server_enc.crt
security.ssl.http.tlcp.enc_key: server_enc.key

# ---- 信任链 ----
security.ssl.http.tlcp.trusted_ca_certificate: ca_chain.crt

# ---- TLCP 协议设置 ----
security.ssl.http.tlcp.protocol: TLSv1.3
security.ssl.http.tlcp.cipher_suites:
  - "TLS_SM4_GCM_SM3"
  - "TLS_SM4_CCM_SM3"

Transport 层 #

# ---- 启用铜锁国密引擎 ----
security.ssl.use_tongsuo: true
security.ssl.transport.enabled: true

# ---- TLCP 双证书(PEM 格式) ----
security.ssl.transport.tlcp.sign_certificate: server_sign.crt
security.ssl.transport.tlcp.sign_key: server_sign.key
security.ssl.transport.tlcp.enc_certificate: server_enc.crt
security.ssl.transport.tlcp.enc_key: server_enc.key

# ---- 信任链 ----
security.ssl.transport.tlcp.trusted_ca_certificate: ca_chain.crt

# ---- TLCP 协议设置 ----
security.ssl.transport.tlcp.protocol: TLSv1.3
security.ssl.transport.tlcp.cipher_suites:
  - "TLS_SM4_GCM_SM3"
  - "TLS_SM4_CCM_SM3"

# ---- 节点间通信建议 ----
security.ssl.transport.skip_domain_verify: true
security.ssl.transport.resolve_hostname: false

参数说明 #

参数说明
security.ssl.use_tongsuo是否启用铜锁国密引擎,使用国密必须设为 true
*.tlcp.sign_certificate签名证书文件(PEM),用于数字签名
*.tlcp.sign_key签名私钥文件(PEM)
*.tlcp.enc_certificate加密证书文件(PEM),用于密钥交换
*.tlcp.enc_key加密私钥文件(PEM)
*.tlcp.trusted_ca_certificateCA 信任链文件(PEM),需使用 ca_chain.crt(包含中间 CA + 根 CA)
*.tlcp.protocolTLS 协议版本,推荐 TLSv1.3;如设为 TLCP,需确认运行环境支持,否则启动报错
*.tlcp.cipher_suites国密密码套件列表(可选,默认 TLS_SM4_GCM_SM3

文件路径相对于 config/ 目录。sign_alias / enc_alias 在 PEM 模式可省略(默认 sign / enc,内部仍会使用该别名装载双证书),initialize.sh --tlcp 会自动写入这两个值。

可用密码套件 #

套件名称说明
TLS_SM4_GCM_SM3SM4-GCM 加密 + SM3 哈希(推荐)
TLS_SM4_CCM_SM3SM4-CCM 加密 + SM3 哈希

完整配置示例 #

HTTP + Transport 同时启用国密:

# ============== 国密 TLCP 完整配置 ==============

security.enabled: true

# ---- 启用铜锁引擎 ----
security.ssl.use_tongsuo: true

# ---- HTTP 层 TLCP ----
security.ssl.http.enabled: true
security.ssl.http.tlcp.sign_certificate: server_sign.crt
security.ssl.http.tlcp.sign_key: server_sign.key
security.ssl.http.tlcp.enc_certificate: server_enc.crt
security.ssl.http.tlcp.enc_key: server_enc.key
security.ssl.http.tlcp.trusted_ca_certificate: ca_chain.crt
security.ssl.http.tlcp.protocol: TLSv1.3
security.ssl.http.tlcp.cipher_suites:
  - "TLS_SM4_GCM_SM3"
  - "TLS_SM4_CCM_SM3"

# ---- Transport 层 TLCP ----
security.ssl.transport.enabled: true
security.ssl.transport.tlcp.sign_certificate: server_sign.crt
security.ssl.transport.tlcp.sign_key: server_sign.key
security.ssl.transport.tlcp.enc_certificate: server_enc.crt
security.ssl.transport.tlcp.enc_key: server_enc.key
security.ssl.transport.tlcp.trusted_ca_certificate: ca_chain.crt
security.ssl.transport.tlcp.protocol: TLSv1.3
security.ssl.transport.tlcp.cipher_suites:
  - "TLS_SM4_GCM_SM3"
  - "TLS_SM4_CCM_SM3"
security.ssl.transport.skip_domain_verify: true
security.ssl.transport.resolve_hostname: false

# ---- 访问控制 ----
security.allow_default_init_securityindex: true
security.restapi.roles_enabled: ["superuser", "security_rest_api_access"]

备选:PKCS12 Truststore 模式 #

如果需要使用 PKCS12 格式的 Truststore(不推荐,仅用于兼容场景):

security.ssl.http.truststore_filepath: http-truststore-sm2.p12
security.ssl.http.truststore_password: changeit

security.ssl.transport.truststore_filepath: transport-truststore-sm2.p12
security.ssl.transport.truststore_password: changeit

注意事项

  • PEM 模式为推荐路径,PKCS12 仅用于特定兼容场景。
  • 脚本生成的 http-keystore-sm2.p12transport-keystore-sm2.p12空 Keystore 占位文件,不包含 TLCP 双证书。
  • TLCP 双证书要求 sign/enc 两套证书;使用 PKCS12 需自行构造包含双证书与别名的 Keystore,并承担 SM2/JCA 兼容性风险。

tlcp-curl 工具 #

Easysearch 提供 bin/tlcp-curl.sh,用于在国密 TLCP 环境下发起 HTTP 请求,行为类似 curl,但底层使用铜锁 JCA Provider 建立 TLCP 连接。

bin/tlcp-curl.sh --url https://<host>:9200/_cluster/health -u admin:changeit

tlcp-curl.sh 默认不发送客户端证书。传入 --cert/--key/--enc-cert/--enc-key 任一参数后才启用客户端证书模式;未显式指定的签名证书/密钥会回退到 config/admin.crt / config/admin.key。仅当服务端配置 security.ssl.http.clientauth_mode: REQUIRE 时,客户端证书才是必需的。

常用参数 #

参数说明
--url <url>目标 URL
-X <method>HTTP 方法,默认 GET
-u <user:pass>HTTP Basic 认证
-H <header>自定义请求头,可多次指定
-d <data>请求体字符串
--data-file <file>从文件读取请求体
--cert <path>客户端签名证书 PEM(仅在启用客户端证书模式时使用)
--key <path>客户端签名私钥 PEM(仅在启用客户端证书模式时使用)
--enc-cert <path>客户端加密证书 PEM(可选,支持自动推导)
--enc-key <path>客户端加密私钥 PEM(可选,支持自动推导)
--no-cert不发送客户端证书(当前默认行为)
--ca <path>信任 CA PEM,默认 config/ca_chain.crt
--insecure跳过服务端证书和主机名验证(当前默认行为,参数保留用于兼容)
--protocol <name>TLS 协议,默认 TLSv1.3
--cipher <name>密码套件,默认 TLS_SM4_GCM_SM3
-i输出中包含响应头
-s静默模式,不输出诊断信息
-v详细调试输出
-o <file>将响应体写入文件
-w <format>输出格式串(仅短参数),支持 %{http_code}%{time_total}
--connect-timeout <s>连接超时秒数,默认 10
--max-time <s>最大等待秒数,默认 60

--enc-cert / --enc-key 自动推导规则(优先级):显式参数 > 从 --cert/--key 路径中的 _sign 推导 _enc > config/client_enc.crt|key > 回退到签名证书/密钥路径。

示例 #

验证国密端点(默认场景,无需客户端证书):

bin/tlcp-curl.sh --url https://localhost:9200/_security/sslinfo?pretty \
  -u admin:changeit

服务端启用 security.ssl.http.clientauth_mode: REQUIRE 时,使用客户端双证书(双向认证):

bin/tlcp-curl.sh --url https://localhost:9200/_cluster/health \
  --cert config/client_sign.crt --key config/client_sign.key \
  --enc-cert config/client_enc.crt --enc-key config/client_enc.key \
  --ca config/ca_chain.crt

仅使用用户名密码(不发送客户端证书):

bin/tlcp-curl.sh --url https://localhost:9200/_cluster/health?pretty \
  -u admin:changeit

使用 admin.crt / admin.key 访问:

bin/tlcp-curl.sh --url https://localhost:9200/_cluster/health?pretty \
  -u admin:changeit \
  --cert config/admin.crt \
  --key config/admin.key

输出状态码与耗时(-w):

bin/tlcp-curl.sh --url https://localhost:9200/_cluster/health \
  --cert config/client_sign.crt --key config/client_sign.key \
  --enc-cert config/client_enc.crt --enc-key config/client_enc.key \
  --ca config/ca_chain.crt \
  -o /tmp/tlcp-health.json \
  -w 'http=%{http_code} time=%{time_total}s\n'

工具依赖 modules/security/ 下的 jar 包,需在 Easysearch 发行包根目录下执行。


启动与验证 #

1. 启动节点 #

正常启动 Easysearch,日志中应能看到 Tongsuo 安全提供者加载成功。

2. 查看 SSL 信息 #

bin/tlcp-curl.sh --url https://<host>:9200/_security/sslinfo?pretty \
  -u admin:changeit \
  --cert config/client_sign.crt --key config/client_sign.key \
  --enc-cert config/client_enc.crt --enc-key config/client_enc.key \
  --ca config/ca_chain.crt

期望返回中包含:

{
  "ssl_provider" : "Tongsuo_Security_Provider",
  "local_certificates_list" : [ ... ]
}

确认 ssl_providerTongsuo_Security_Providerlocal_certificates_list 中包含签名和加密证书即表示配置成功。


常见问题 #

SSLContext.getInstance("TLCP") 报错 #

当前运行环境的 JDK 不支持 TLCP 协议名,请将 protocol 改为 TLSv1.3

security.ssl.http.tlcp.protocol: TLSv1.3

铜锁 OpenJDK 在 TLSv1.3 下依然会使用国密套件进行协商。

Cipher Suite 不生效 #

TLS 1.3 的密码套件不可通过 setEnabledCipherSuites 禁用,这是 TLS 1.3 协议规范的行为,不影响国密功能。

证书链验证失败 #

请确认使用 ca_chain.crt(包含中间 CA + 根 CA 的完整链)而不是单独的 ca.crt

# ✅ 正确 — 使用完整信任链
security.ssl.http.tlcp.trusted_ca_certificate: ca_chain.crt

# ❌ 错误 — 仅包含根 CA,缺少中间 CA
security.ssl.http.tlcp.trusted_ca_certificate: ca.crt

平台与原生库问题 #

可按“证书生成”和“节点运行”两个维度理解平台支持:

维度支持平台说明
证书生成Linux(x86_64 / aarch64)必须安装并使用 tongsuo 命令
证书生成macOS(x86_64 / arm64)及其他非 Linux 平台优先 tongsuo,未安装时 fallback 到 openssl(需支持 SM2/SM3);若两者都不可用则脚本失败退出
节点运行(国密)linux-x86_64bin/easysearch 可识别并加载对应 JNI 原生库
节点运行(国密)linux-aarch64bin/easysearch 可识别并加载对应 JNI 原生库
节点运行(国密)darwin-x86_64bin/easysearch 可识别并加载对应 JNI 原生库
节点运行(国密)darwin-aarch64bin/easysearch 可识别并加载对应 JNI 原生库

以上“节点运行”平台为启动脚本识别的目标平台;实际可用性仍取决于发行包中是否包含对应 native 库文件。


合规参考 #

标准说明
GM/T 0024-2014SSL VPN 技术规范
GM/T 0028-2014密码模块安全技术要求
JR/T 0197-2020金融行业密码应用技术标准

生产环境部署前,建议与合规团队确认具体的国密要求和认证需求。


延伸阅读 #