java 生成truststore_在使用Java中的默认KeyStore(JSSE)时如何提供特定的TrustStore

小编典典

听起来您面临与此问题类似的问题,因为null用于in的trustmanager参数可SSLContext.init(...)还原为默认的信任管理器,而不适用于密钥管理器。

话虽如此,使用默认系统属性初始化KeyManager并不难。这样的事情应该可以工作(直接在此答案中编写的代码,因此您可能需要修复一些小问题):

String provider = System.getProperty("javax.net.ssl.keyStoreProvider");

String keystoreType = System.getProperty("javax.net.ssl.keyStoreType", KeyStore.getDefaultType());

KeyStore ks = null;

if (provider != null) {

ks = KeyStore.getInstance(keystoreType, provider);

} else {

ks = KeyStore.getInstance(keystoreType);

}

InputStream ksis = null;

String keystorePath = System.getProperty("javax.net.ssl.keyStore");

String keystorePassword = System.getProperty("javax.net.ssl.keyStorePassword");

if (keystorePath != null && !"NONE".equals(keystorePath)) {

ksis = new FileInputStream(keystorePath);

}

try {

ks.load(ksis, keystorePassword.toCharArray());

} finally {

if (ksis != null) { ksis.close(); }

}

KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());

kmf.init(ks, keystorePassword.toCharArray());

// Note that there is no property for the key password itself, which may be different.

// We're using the keystore password too.

SSLContext sslContext = SSLContext.getInstance("TLS");

sslContext.init(kmf.getKeyManagers(), ..., null);

(更具体地说,也可能是该实用程序类感兴趣的类getKeyStoreDefaultLoader()。)

编辑:( 在您的其他评论之后)

恐怕您只想自定义一半的Oracle和IBM JSSE似乎都没有默认行为SSLContext。您在Oracle JSSE文档中链接到的部分说:“

_如果javax.net.ssl.keyStore系统属性和相应的javax.net.ssl.keyStorePassword系统属性指定了密钥库,则默认SSLContext创建的KeyManager将是用于管理指定密钥库的KeyManager实施。_

“由于您使用的是custom SSLContext,无论如何都不是默认值(即使您要自定义其中的一部分),因此在这里并不会真正应用。

无论如何,Oracle JSSE参考指南和IBM

JSSE参考指南在此主题上有所不同。(我不确定这其中有多少是“标准的”,以及一个原则上是否应该与另一个相容,但是显然不是这种情况。)

这两个“ 创建SSLContext对象 ”部分是 几乎 相同的,但它们是不同的。

如果KeyManager []参数为null,则将为此上下文定义一个空的KeyManager。

如果KeyManager

[]参数为null,则将在安装的安全提供程序中搜索KeyManagerFactory的最高优先级实现,从中将获取适当的KeyManager。

不幸的是,如果您希望具有不同规范的实现之间具有相同的行为,则即使要有效地复制其中一个实现已经执行的操作,也必须编写一些代码。

2020-11-16

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JDBC 连接 SQL Server ,可以使用 SSL 进行加密通信。默认情况下,JDBC 不会使用 SSL 连接 SQL Server,需要进行一些配置。 以下是使用 SSL 连接 SQL Server 的步骤: 1. 在 SQL Server 上启用 SSL:在 SQL Server 配置管理器,找到 SQL Server Network Configuration -> Protocols for MSSQLSERVER -> 右键点击 Properties -> Certificate,选择自己的证书(或者创建一个新证书),将 ForceEncryption 属性设置为 Yes。 2. 获取 SQL Server 证书:从 SQL Server 所在的计算机导出证书(包括私钥),将其保存到本地。可以使用 Microsoft Management Console(MMC)的证书管理器来完成此操作。 3. 将证书导入到客户端的 TrustStore :打开 cmd,切换到 JDK 的 bin 目录,执行以下命令: ```keytool -import -file <path_to_certificate> -alias <certificate_alias> -keystore <path_to_truststore>``` 其,<path_to_certificate> 是证书文件的路径,<certificate_alias> 是证书别名,<path_to_truststore> 是客户端的 TrustStore 的路径。 4. 在 JDBC URL 启用 SSL:在 JDBC URL 添加以下参数: ```encrypt=true;trustStore=<path_to_truststore>;trustStorePassword=<truststore_password>``` 其,<path_to_truststore> 是客户端的 TrustStore 的路径,<truststore_password> 是 TrustStore 的密码。 完整的 JDBC URL 可能类似于: ```jdbc:sqlserver://<server>:<port>;databaseName=<database>;encrypt=true;trustStore=<path_to_truststore>;trustStorePassword=<truststore_password>``` 注意,TrustStore 的证书必须是可信的,否则 SSL 连接将失败。另外,为了保证安全性,TrustStore 应该只包含必要的证书。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值