使用Java APis验证X509证书

如何解决使用Java APis验证X509证书

| 我正在尝试根据Java密钥库验证证书,这是我正在使用的代码,如下所示。如果成功完成,那么我认为验证已正确完成,否则,如果引发异常,则验证失败。 我的担心是: 下面的代码是否足以验证证书?就像在这里,我缺少什么(就像检查由计算机发送给我的证书所签名的数据一样?)? 2.是否应验证证书中包含的签名?如果是,怎么办? 预先感谢您的回复! 普拉迪普
// To check the validity of the dates
cert.checkValidity();
//Check the chain
CertificateFactory cf = CertificateFactory.getInstance(\"X.509\");
List<X509Certificate> mylist = new ArrayList<X509Certificate>();          
mylist.add(cert);
CertPath cp = cf.generateCertPath(mylist);
PKIXParameters params = new PKIXParameters(getTrustStore());
params.setRevocationEnabled(false);
CertPathValidator cpv =
      CertPathValidator.getInstance(CertPathValidator.getDefaultType());
PKIXCertPathValidatorResult pkixCertPathValidatorResult =
      (PKIXCertPathValidatorResult) cpv.validate(cp,params);
    

解决方法

通常,证书将由中间颁发机构而不是“根”颁发机构(这应该在您的信任库中)颁发。大多数协议都鼓励发送证书的“链”,而不仅仅是实体的证书。 您应该添加所有中间证书,以便可以形成完整的链。 为了确定证书仍然有效,您不应禁用吊销检查。如果您不想检索CRL(可能很大),则发行者可以提供OCSP支持。但是,必须通过设置某些系统属性在Java运行时中启用它。 如果路径验证程序成功返回,则无需检查其他任何内容。如果证书无效,将引发异常。 同样,无需对有效日期进行明确检查。这会在验证期间发生(使用当前时间,除非您通过
PKIXParameters
指定时间)。 有关验证的更广泛讨论,包括示例代码,请参阅我的先前答案。     ,如果您对默认的信任设置感到满意(因为默认信任设置将用于默认的
SSLContext
),则可以独立于SSL / TLS构建
X509TrustManager
,并使用if来独立验证证书。 它看起来像这样:
TrustManagerFactory trustManagerFactory =
    TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore)null);
// you could use a non-default KeyStore as your truststore too,instead of null.

for (TrustManager trustManager: trustManagerFactory.getTrustManagers()) {  
    if (trustManager instanceof X509TrustManager) {  
        X509TrustManager x509TrustManager = (X509TrustManager)trustManager;  
        x509TrustManager.checkServerTrusted(...);
    }  
}
(您还应该检查服务器的身份和证书匹配,请参阅RFC 6125(在传输层安全性上下文中使用X.509(PKIX)证书在Internet公钥基础结构中表示和验证基于域的应用程序服务身份) (TLS))。     ,您在此处所做的工作是验证信任存储区中的任何受信任CA是否已(直接)对证书(在示例中为“ 5”)进行了签名。 此外,您检查是否到期,但不执行吊销检查。 因此,如果任何受信任的CA都未对“ 5”进行签名,您将获得一个例外。 因此,该代码足以验证任何受信任的CA是否已签署了“ 5” 如果您指的是服务器身份验证,则帖子中的代码不足。 此代码仅验证特定证书是否由受信任的CA签名。 但是,您没有任何迹象表明发送此证书的\“实体\”实际上是证书的所有者(即,他们拥有与此证书关联的私钥)。 这是SSL身份验证的一部分,例如客户端发送用远程服务器的公钥加密的“ 8”消息,并确定如果对方是假的,则无法解密该消息     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-