1 mongo相关的参数
--tlsAllowConnectionsWithoutCertificates 允许客户端连接而不提供证书
--tlsAllowInvalidHostnames 允许服务器证书提供不匹配的主机名
--tlsAllowInvalidCertificates 允许连接到证书无效的服务器
2 一个java对外请求究竟有多少truststore
首先,我们需要理解 CA 证书的存储和管理机制。在 JDK 中,存在多个默 认的 CA 证书库,它们分别位于不同的位置。这些位置包括:
1. 应用程序级别的证书库:位于 Java 安装目录的 `jre/lib/security/cacerts`文件中。这是 JDK 默认使用的系统级别证书库, 其中存储了大量的受信任的 CA 证书。
2. 用户级别的证书库:位于用户的个人目录下的`.keystore`文件中。这个
文件是一个二进制文件,存储了个人用户导入的或自签名的证书。
另外,我们可以通过配置`javax.net.ssl.trustStore`系统属性来指定其他的 证书库路径。例如,我们可以使用以下命令行选项来指定自定义的证书库 路径:
java -Djavax.net.ssl.trustStore=/path/to/custom/truststore
默认情况下,JDK 会在运行时加载上述证书库,并使用其中的 CA 证书进 行身份验证。如果需要,我们可以在程序中动态加载和管理这些证书库。
接下来,让我们看一下如何在 Java 中通过代码来获取和使用 CA 证书的路 径。
java import java.security.KeyStore; import java.security.cert.Certificate;
public class Main {
public static void main(String[] args) throws Exception {
获取默认的系统级别证书库
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
加载证书库 遍历证书库中的 CA 证书
for (String alias : keyStore.aliases()) {
Certificate cert = keyStore.getCertificate(alias);
打印证书的主题
System.out.println(cert.getSubjectDN());
}
获取用户级别的证书库
KeyStore userKeyStore = KeyStore.getInstance("JKS");
char[] password = "password".toCharArray(); 证书库密码
userKeyStore.load(new FileInputStream("/path/to/user/keystore.jks"), password);
加载证 书库 遍历证书库中的 CA 证书
for (String alias : userKeyStore.aliases()) {
Certificate cert = userKeyStore.getCertificate(alias);
打印证书的主题 System.out.println(cert.getSubjectDN());
} } }
上述代码中,我们首先使用`KeyStore.getDefaultType()`获取默认的系统 级别证书库类型。然后,使用`keyStore.load(null, null)`加载证书库。接 着,我们遍历证书库中的所有 CA 证书,并使用`cert.getSubjectDN()`获 取证书的主题,并将其打印出来。
类似地,我们也可以通过`KeyStore.getInstance("JKS")`获取用户级别的 证书库,并加载、遍历证书,以及获取主题。只需指定证书库的文件路径 和密码即可。
--------------------------------------------------------
作者:n叶子1
链接:https://wenku.baidu.com/view/882334a8b7daa58da0116c175f0e7cd1842518d6.html
3 https://blog.51cto.com/u_16213689/8935443
java中的KeyStore这种文件可以分为两类:KeyStore和TrustStore。KeyStore保存私钥,在加解密、签名时使用。TrustStore保存可信任的证书,用于对被访问者进行认证。所以准确的来说cacerts文件其实应该属于TrustStore。
初始化SSLContext时会将TrustStore中的所有证书加载进来。TrustManagerFactoryImpl.getCacertsKeyStore()方法负责加载证书,首先查找JRE/lib/security/cacerts文件。如果都不存在,则使用空的TrustStore,这样的话不会有服务器的CA证书被校验通过。
初始化后,客户端会与服务器端建立连接,然后进入Handshake过程,当拿到服务器端的CA证书时,会调用X509TrustManager. checkServerTrusted(…)方法,
a).校验域名/IP
校验访问地址中的域名/IP(要么域名,要么IP)是否与服务器证书包含的一致,使用到HostnameChecker. match方法进行。
如果访问使用的是域名,但服务器CA证书中没有包含域名,则抛出错误:
No subject alternative DNS name matching localhost found //其中localhost表示域名。
如果访问使用的是IP,但服务器CA证书中没有IP,则抛出错误:
No subject alternative names present
如果域名不匹配抛出错误:
No name matching localhost found //其中localhost表示域名。
如果IP不匹配,则抛出错误:
No subject alternative names matching IP address 127.0.0.1 found //其中127.0.0.1表示ip。
b). 服务器证书是否可信
通过加载的TrustStore证书来校验服务器的证书是否由信任的证书机构颁发,使用到方法PKIXValidator.engineValidate()。该校验过程如果失败,则抛出类似如下错误:
PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
HostnameVerifier和SSLSocketFactory。这两个类是实现HTTPS请求的核心,通过配置这两个类可以影响SSL层校验域名/IP和服务器证书校验的过程。可以通过HttpsURLConnection.SetDefaultSSLSocketFactory和HttpsURLConnection.SetDefaultHostnameVerifier来设置
标签:KeyStore,mongo,证书,IP,CA,no,域名,加载,name From: https://www.cnblogs.com/silyvin/p/18563559