KeyUsage does not allow key encipherment ssl证书验证失败问题

浏览器提示ERR_SSL_KEY_USAGE_INCOMPATIBLE解决 错误通常发生在使用 SSL/TLS 连接时,指的是客户端和服务器之间进行安全通信尝试失败,原因是证书中的密钥用途(Key Usage)或扩展密钥用途(Extended Key Usage, EKU)与正在尝试的操作不兼容。如果尝试使用证书执行未经授权的操作(比如,使用仅限签名的证书来建立 SSL/TLS 连接),就可能触发。扩展密钥用途提供了更具体的限制,指定了证书可以用于哪些特定的应用。例如,有的证书可能明确指定仅用于服务器身份验证(通常用于 HTTPS),而有的则可能用于客户端身份验证、代码签名等。 阅读详情

ssl证书验证失败问题

错误信息

javax.net.ssl.SSLHandshakeException: KeyUsage does not allow key encipherment}, caused by {sun.security.validator.ValidatorException: KeyUsage does not allow key encipherment

调查方式底层代码debug查找

通过小编费力的debug,找到了报错代码的位置。
通常解决问题的方式都是找到根源报错位置才可以。
代码片段,只保留需要部分。

package sun.security.validator;

import java.security.cert.CertificateException;
...

class EndEntityChecker {
 	private boolean checkKeyUsage(X509Certificate var1, int var2) throws CertificateException {
        boolean[] var3 = var1.getKeyUsage();
        if (var3 == null) {
            return true;
        } else {
            return var3.length > var2 && var3[var2];
        }
    }
    ...

    private void checkTLSServer(X509Certificate var1, String var2, Set<String> var3) throws CertificateException {
        if (KU_SERVER_ENCRYPTION.contains(var2)) {
            if (!this.checkKeyUsage(var1, 2)) {
                throw new ValidatorException("KeyUsage does not allow key encipherment", ValidatorException.T_EE_EXTENSIONS, var1);
            }
        } else if (KU_SERVER_SIGNATURE.contains(var2)) {
            if (!this.checkKeyUsage(var1, 0)) {
                throw new ValidatorException("KeyUsage does not allow digital signatures", ValidatorException.T_EE_EXTENSIONS, var1);
            }
        } else {
            if (!KU_SERVER_KEY_AGREEMENT.contains(var2)) {
                throw new CertificateException("Unknown authType: " + var2);
            }

            if (!this.checkKeyUsage(var1, 4)) {
                throw new ValidatorException("KeyUsage does not allow key agreement", ValidatorException.T_EE_EXTENSIONS, var1);
            }
        }

        if (!this.checkEKU(var1, var3, "1.3.6.1.5.5.7.3.1") && !this.checkEKU(var1, var3, "1.3.6.1.4.1.311.10.3.3") && !this.checkEKU(var1, var3, "2.16.840.1.113730.4.1")) {
            throw new ValidatorException("Extended key usage does not permit use for TLS server authentication", ValidatorException.T_EE_EXTENSIONS, var1);
        } else if (!SimpleValidator.getNetscapeCertTypeBit(var1, "ssl_server")) {
            throw new ValidatorException("Netscape cert type does not permit use for SSL server", ValidatorException.T_EE_EXTENSIONS, var1);
        } else {
            var3.remove("2.5.29.15");
            var3.remove("2.5.29.37");
            var3.remove("2.16.840.1.113730.1.1");
        }
    }

想必你已经发现了报错的代码位置,就是log日志中的报错信息的位置。

if (KU_SERVER_ENCRYPTION.contains(var2)) {
            if (!this.checkKeyUsage(var1, 2)) {
                throw new ValidatorException("KeyUsage does not allow key encipherment", ValidatorException.T_EE_EXTENSIONS, var1);
            }

报错的原因是KU_SERVER_ENCRYPTION中包含了var2,但是调用checkKeyUsage方法时返回了false,验证失败,所以抛出异常。

 private static final Collection<String> KU_SERVER_ENCRYPTION = Arrays.asList("RSA");

不错var2就是字符串“RSA”.
var2是怎么取到的呢?
这个问题很好,通过小编的debug,发现是再向目标服务第二次握手后走就会走到这段验证的代码,所以应该是从目标服务中的加密套件组ciphers中取到的。
具体过程就不再赘述了。
接下来看认证过程。

 private boolean checkKeyUsage(X509Certificate var1, int var2) throws CertificateException {
        boolean[] var3 = var1.getKeyUsage();
        if (var3 == null) {
            return true;
        } else {
            return var3.length > var2 && var3[var2];
        }
    }

通过上面的认证代码不难看出参数所代表的含义。
var1代表证书信息,var2 就是调用时所传入的int值 2
通过***var1.getKeyUsage()***取出证书KeyUsage中的配置信息。
如果没有配置,不需要验证直接返回true。
如果有配置,则长度要大于var2的值,因为var2是下标,防止数组下标越界的判断。var3的长度是9准定大于2.
数组的值[true, false, false, false …] index 2所对应的数值是false。
所以代入方法,var3[var2] = false, 因为是&&所以返回false。

**var3[var2]**就是KeyUsage中的某个配置项,那是什么呢?怎么配置呢?

package sun.security.x509;
...
public class X509CertImpl extends X509Certificate implements DerEncoder {
...
 public boolean[] getKeyUsage() {
        try {
            String var1 = OIDMap.getName(PKIXExtensions.KeyUsage_Id);
            if (var1 == null) {
                return null;
            } else {
                KeyUsageExtension var2 = (KeyUsageExtension)this.get(var1);
                if (var2 == null) {
                    return null;
                } else {
                    boolean[] var3 = var2.getBits();
                    if (var3.length < 9) {
                        boolean[] var4 = new boolean[9];
                        System.arraycopy(var3, 0, var4, 0, var3.length);
                        var3 = var4;
                    }

                    return var3;
                }
            }
        } catch (Exception var5) {
            return null;
        }
    }
package sun.security.x509;
...
public class KeyUsageExtension extends Extension implements CertAttrSet<String> {
...
   public boolean[] getBits() {
        return (boolean[])this.bitString.clone();
    }
...
 public void set(String var1, Object var2) throws IOException {
        if (!(var2 instanceof Boolean)) {
            throw new IOException("Attribute must be of type Boolean.");
        } else {
            boolean var3 = (Boolean)var2;
            if (var1.equalsIgnoreCase("digital_signature")) {
                this.set(0, var3);
            } else if (var1.equalsIgnoreCase("non_repudiation")) {
                this.set(1, var3);
            } else if (var1.equalsIgnoreCase("key_encipherment")) {
                this.set(2, var3);
            } else if (var1.equalsIgnoreCase("data_encipherment")) {
                this.set(3, var3);
            } else if (var1.equalsIgnoreCase("key_agreement")) {
                this.set(4, var3);
            } else if (var1.equalsIgnoreCase("key_certsign")) {
                this.set(5, var3);
            } else if (var1.equalsIgnoreCase("crl_sign")) {
                this.set(6, var3);
            } else if (var1.equalsIgnoreCase("encipher_only")) {
                this.set(7, var3);
            } else {
                if (!var1.equalsIgnoreCase("decipher_only")) {
                    throw new IOException("Attribute name not recognized by CertAttrSet:KeyUsage.");
                }

                this.set(8, var3);
            }

            this.encodeThis();
        }
    }

通过代码的调用我们找到了KeyUsageExtension 类。
我们通过这个set方法来看,因为我们获取的值准定是先在读取证书的时候已经set了,所以看这块代码才能知道如何控制着数组。
index 为2的值是 key_encipherment
所以说明需要在证书的KeyUsage中添加此项才能通过此项认证,还有一种方式就是不配置KeyUsage.
解决方式在制作证书脚本中增加keyUsage = keyEncipherment

...
keyUsage = Digital Signature, keyEncipherment
...

验证通过!亲测!

【牛股启动线】副图指标使用技术说明,图文案例分享,通达信炒股指标 如上图,在紫色线在黑色虚线上时,在出现紫色柱线时,通常会出现强势拉升的行情​。柱线加长加上紫色线上扬,进场跟随做多抓强势行情,紫色柱线和紫色线同时做多持续则可以继续持股。如上图,副图指标【牛股启动线】,指标信号包括紫色线走势信号和紫色柱线信号,以及底部的四条虚线技术信号​,还有一条绿色的参考线,一条黑色的虚线两天分档线。如上图,参考买点,紫色柱线开始出现时进场买点,在上图标记的位置对应的就是进场买点​。紫色柱线加长+紫色线上扬,多头共振持股,行情继续拉升阶段,持股待涨或顺势​进场做多。 阅读详情

相关推荐

STM32F105双路CAN通讯无法进入接收中断问题及解决方法

STM32F105RBT6双路CAN通讯无法进入接收中断问题及解决方法

m0_62383223的博客 3442

使用CFSSL手动构建Kubernetes集群PKI证书体系实战指南

在分布式系统和云原生架构中,公钥基础设施(PKI)是实现组件间安全通信与身份认证的基石。其核心原理基于非对称加密技术,通过证书颁发机构(CA)签发数字证书,为服务端和客户端提供身份验证、数据加密与完整性保护。这项技术的核心价值在于为动态、复杂的微服务环境建立了可验证的信任链,是保障系统安全性的关键。在Kubernetes这类容器编排平台中,PKI的应用尤为广泛和关键,它确保了控制平面组件(如API Server)、数据存储(etcd)和工作节点(kubelet)之间的所有TLS通信都是加密且可信的。本文将以

weixin_30383279的博客 357

从零到一:FAST_LIO与FAST_LIO2算法环境搭建与实战评测

本文详细介绍了FAST_LIO与FAST_LIO2算法的环境搭建与实战评测,包括算法原理、环境配置避坑指南、源码编译技巧及性能对比。FAST_LIO2凭借ikd-tree数据结构在动态环境中表现优异,处理速度提升至15ms,内存占用降低40%。文章还提供了常见问题排查和进阶优化技巧,助力开发者高效实现SLAM应用。

weixin_29271053的博客 470

证书中的keyUsage extension

参见 https://superuser.com/questions/738612/openssl-ca-keyusage-extension

qinghai5068的专栏 1711

cs231n作业 assignment 1 q1 q2 q3

请先看课程作业地址。有两种做作业的方法,一种是在google Colab上做 (需魔法),另一种就是下载到本地,但是我懒得在本地配置环境,太麻烦了,还得修改一些基础代码,我就直接在google colab上做了google colab 配置环境只需要跟着教程走就好了最后还有一题解答题懒得做的,这个题目做的没啥意思。让我们用简单写法来实现softmax的loss函数与梯度计算。

Leezed525的博客 9278

量子密钥分发系统的工程实践(四):FPGA在后处理中的核心实现与优化

本文深入探讨了FPGA在量子密钥分发(QKD)系统后处理中的核心实现与优化策略。文章详细拆解了FPGA如何高效完成原始密钥提取、误码协商和私密放大等关键任务,并分享了流水线设计、资源复用及存储器架构优化等工程实践“心法”,旨在解决高速、实时QKD系统中的性能瓶颈,提升密钥生成率。

t8u9v0的博客 388

密码学专题 openssl的基本概念

配置文件 配置文件是OpenSSL的一个基础结构组件,OpenSSL使用一组称为OpenSSLCONF的函数来读取OpenSSL配置文件的信息。OpenSSL提供的主配置文件是opensl.cnf,它集成了OpenSSL所要使用的配置文件选项的大部分内容。此外,OpenSSL还提供了其他一些部分的配置文件,用于专门配置证书请求或者X.509v3证书的扩展项。 OpenSSL的配置文件使用字段的概念分成不同的部分。一般来说,每个字段的开始使用[Section_Name]来标识,直到下一个字段开始或者到达文

CHYabc123456hh的博客 3256

[密码学实战]商密TLCP协议抓包解析与深度分析(二十九)

[密码学实战]商密TLCP协议抓包解析与深度分析(二十九)

曼岛_的博客 633

java数据签名错误,错误:密钥使用不允许数字签名 - Java的小程序+相互SSL

We have developed a webbased Java application running in Tomcat under IIS on Windows 2008. The website has 2-way (mutual) SSL enabled in IIS requiring the client to authenticate using a x.509 certific...

weixin_32578799的博客 693

Cesium+Vue3教程(003):基于Vue3的Cesium自定义地图和地图叠加

在 Cesium 中,是用于加载地表影像图层的核心接口。通过它,您可以将各种地图服务(如卫星影像、街道地图、自定义瓦片等)加载到 Cesium 的地球上。Cesium 提供了多个内置的。

WwLK123的博客 635

YOLOv13改进策略【Head】| 引入RT-DETR中的RTDETRDecoder,替换检测头

本文记录的是基于RTDETRDecoder模块的YOLOv13目标检测改进方法研究。RT-DETR的模块通过,能为解码器提供高质量的初始,从而。相比v13原始的检测头,RT-DETR能,替换后能够更好的提高模型性能。

Limiiiing的博客 434

java无法验证签名_java – KeyUsage不允许数字签名

我正在尝试从我的Java EE程序向需要证书身份验证的主机发送HTTPS请求.我有一个正确的密钥库文件,信任库和导入的CA,两个列表都显示证书在里面.但是我收到以下错误:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: KeyUsage does not allow digital sig...

weixin_34740753的博客 1251

全能媒体工具深度测评(下篇一):AI图文生成+全能解压+图片去文字,一键搞定素材精修

解压50多种格式,文生图,图生图

cs821984831的博客 42

Bindu mTLS 部署指南:基于 Smallstep step-ca 与 Ory Hydra 的代理间双向 TLS 实战

> 本指南面向 DevOps / 基础设施团队,讲解如何在 Infragrid 集群上以 Smallstep step-ca 为私有证书颁发机构(CA),配合现有 Ory Hydra OAuth2/OIDC 服务与 HashiCorp Vault,为 Bindu 的全部 agent-to-agent(A2A,HTTP 3773 端口)与 core-to-SDK(gRPC 3774 端口)通信启用双

gitblog_00691的博客 300

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Go and HTTPS

转自:http://tonybai.com/2015/04/30/go-and-https/ 近期在构思一个产品,考虑到安全性的原因,可能需要使用到HTTPS协议以及双向数字证书校验。之前只是粗浅接触过HTTP(使用Golang开 发微信系列)。对HTTPS的了解则始于那次自行搭建ngrok服务,在那个过程中照猫画虎地为服务端生成了一些私钥和证书,虽然结果是好 的:ngrok服务成功搭建起来

Programer From Scrach 1689

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

双证书体系key usage扩展——Outlook使用证书发送加密签名邮件

网络认证第十二讲作业 一.作业要求测试邮件客户端软件(如Outlook、Foxmail等)是否支持key usage扩展二.使用工具OpenSSL,OutLook,FoxMail三.实验过程 使用OpenSSL生成证书(1). 首先生成私钥pravate.pem在命令行中键入:genrsa -des3 -out private.pem 2048,使用RSA算法生成2048位私钥,并使用3D...

weixin_33672400的博客 1383

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Go 深入解析,掌握枚举类型与证书使用(KeyUsage)实践_设置证书keyusage

尽管Go没有内置的枚举类型,但通过简单的类型别名和常量,我们可以构建一个强大的枚举系统。KeyUsage的例子只是展示了如何在Go中使用枚举来表示复杂的概念和设置。理解并合理利用这些概念,可以在Go语言的项目中实现更高效和安全的代码设计。自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。

2401_84247726的博客 840

java ssl证书代码_Java代码签名证书与SSL证书相同吗?

但是,越来越多的CA使用这些密钥使用字段颁发证书。当存在时,这些字段限制证书的用法。Java插件检查这些字段是否存在。EndEntityChecker:/*** Check whether this certificate can be used for code signing.* @throws CertificateException if not.*/private void checkC...

weixin_34116482的博客 384

Kubernetes 证书详解

Kubernetes 组件之间证书的关系~

qq_37091832的博客 4148

chrome issue -- list

【代码】chrome issue -- list。

qq_37233070的博客 1185

密钥用法 增强密钥用法 证书类型

密钥用法:数字签名 Digital Signature认可签名 Non Repudiation密钥加密 key Encipherment数据加密 Data Enciphe...

天行健,君子以自强不息;地势坤,君子以厚德载物。 6621

调用https接口时报错:sun.security.validator.ValidatorException

1、现象 调用https接口报如下错误: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requ...

懵懂无知的蜗牛的博客 2万+

【PKI】关于PKI的一些知识

最近看了一些 PKI 的文档,本着对理论知识的深入了解,能够帮助自己更好的写代码的原则。马马虎虎读了不少东西。 简单整理一下: 1. 重放攻击:截获某条通信信道的数据,等一段时间之后,再发送出去给接受者,可以获得同样的反馈效果,后来添加了时间戳来判断信息是否失效。 2. 单点登录:优化用户的使用体验,在多个应用程序使用过程中,减少需要记住的密码个数。 3. 签名密钥对 由签名私钥和验...

jy0921 749

IIS网站使用自签名证书,浏览器提示ERR_SSL_KEY_USAGE_INCOMPATIBLE

使用 Google Chrome、Microsoft Edge 等 Chrome 系浏览器访问使用自签名证书的 IIS 网站时提示 `ERR_SSL_KEY_USAGE_INCOMPATIBLE` 错误。

qq_22842329的博客 5471

linux: 使用openssl查看证书的用途,判断能签发证书

使用OpenSSL查看证书的用途和判断是否能签发证书主要涉及到查看证书中的“Key Usage”和“Extended Key Usage”两个字段。在输出信息中,查找“Key Usage”和“Extended Key Usage”字段。这些字段指示了证书的用途。这意味着证书可以用于数字签名和签发其他证书,并且它被特别指定用于Web服务器和客户端身份验证。通过以上步骤,我们可以了解证书的用途并判断它是否能够签发其他证书。

十年运维开发经验的王义杰在此分享自己的知识和经验 1527

密钥用法标识

Microsoft 信任列表签名 (1.3.6.1.4.1.311.10.3.1) Microsoft Trust List Signing, msCTLSign Microsoft Trust List Signing。CRL 签名 cRLSign msCodeCom Microsoft 商业代码签名 (authenticode)

stay hungry,stay foolish ! 860
上一篇: 使用Jconsole连接到远程服务器springboot工程,亲自踩坑测试
哥德巴赫一号
博客等级 码龄7年 2粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值