当前位置: 首页 > news >正文

Openssl X509 v3 AuthorityKeyIdentifier实验与逻辑分析

       Openssl是X509的事实标准,目前主流OS或个别安全性要求较高的设计场景,对X509的证书链验证已经不在停留在只从数字签名校验了,也就是仅仅从公钥验签的角度,在这些场景中,往往还会校验AuthorityKeyIdentifier和SubjectKeyIdentifier的一致性,也即下级证书的AuthorityKeyIdentifier应该与上级证书的SubjectKeyIdentifier一致,这两个参数是X509 v3  extensions的范围。

        但是X509对SubjectKeyIdentifier与AuthorityKeyIdentifier本身以及它们之前的一致性校验逻辑,都没有严格的规定,因此我们只能follow Openssl的逻辑。

        Openssl的SubjectKeyIdentifier可以为hash,此时是公钥的160bit sha-1散列,或者是一个hex字符串,此时是人为预设的SubjectKeyIdentifier。

        Openssl的AuthorityKeyIdentifier是follow X509定义的,AuthorityKeyIdentifier实际上是一个组,有三个组成员,keyid,dirname,serialnum,keyid就是上级证书的SubjectKeyIdentifier。你可以提供authoritykeyidentifier=keyid,issuer,作为openssl参数,它会尽量把以上三个组成员给填满,为什么说尽量呢,因为上级证书可能压根就没有SubjectKeyIdentifier这个v3 extension属性。

        Openssl的证书链校验,如果提供了issuer_checks参数也是可以校验以上一致性的。

        openssl配置subjectKeyIdentifier = hash,此时openssl在签发证书时,会加入subjectKeyIdentifier参数,如果subjectKeyIdentifier这个参数没有的话,缺省是不会有任何subjectKeyIdentifier被加入的。

        此时如果authorityKeyIdentifier = keyid,issuer,那么只有issuer有效,也即会加入上级证书的dirname,serialnum。

        当subjectKeyIdentifier = hash;authorityKeyIdentifier = keyid,issuer时,产生的下级证书如下图。

        当没有subjectKeyIdentifier = hash;authorityKeyIdentifier = keyid,issuer:always时,产生的下级证书如下图。其中issuer:always强制加入dirname,serialnum两项。

        当没有subjectKeyIdentifier配置;仅有authorityKeyIdentifier = keyid,issuer时,产生的下级证书如下图。可以看到CA证书没有 subjectKeyIdentifier,下级证书没办法复制到subjectKeyIdentifier因此authorityKeyIdentifier 仅有其他两项。

        以上各种情况,均可以通过以下命令验证通过。

        openssl verify -CAfile cacert.pem --issuer_checks certwork.pem

以下为用到的配置文件与测试命令。

[ req ]
distinguished_name = req_distinguished_name
policy             = policy_match
x509_extensions     = v3_ca# For the CA policy
[ policy_match ]
countryName             = optional
stateOrProvinceName     = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
countryName_default             = IN
countryName_min                 = 2
countryName_max                 = 2
stateOrProvinceName             = State or Province Name (full name) ## Print this message
stateOrProvinceName_default     = KARNATAKA ## This is the default value
localityName                    = Locality Name (eg, city) ## Print this message
localityName_default            = BANGALORE ## This is the default value
0.organizationName              = Organization Name (eg, company) ## Print this message
0.organizationName_default      = GoLinuxCloud ## This is the default value
organizationalUnitName          = Organizational Unit Name (eg, section) ## Print this message
organizationalUnitName_default  = Admin ## This is the default value
commonName                      = Common Name (eg, your name or your server hostname) ## Print this message
commonName_max                  = 64
emailAddress                    = Email Address ## Print this message
emailAddress_max                = 64[ v3_ca ]
#subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints = critical,CA:true
nsComment = "OpenSSL Generated Certificate"[ v3_work ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:awlays,issuer:always
basicConstraints = critical,CA:true
nsComment = "OpenSSL Generated Certificate"
openssl genrsa -out private.pem 2048openssl req -new -x509 -days 3650 -config opensslroot.cfg -key private.pem -out cacert.pemopenssl x509 -text -noout -in cacert.pemopenssl genrsa -out workkey.pem 2048openssl req -new -key workkey.pem -config opensslroot.cfg -out certwork.csropenssl req -text -in certwork.csropenssl x509 -req -days 365 -CA cacert.pem -extfile opensslroot.cfg -extensions v3_work -CAcreateserial -CAkey private.pem -in certwork.csr -out certwork.pemopenssl x509 -in certwork.pem -text

http://www.lryc.cn/news/232958.html

相关文章:

  • 聊聊logback的MDCFilter
  • Windows10安装麒麟桌面V10双系统
  • file_put_contents锁的问题
  • 工作中积累的对K8s的就绪和存活探针的一些认识
  • 什么是会话固定以及如何在 Node.js 中防止它
  • 代码随想录算法训练营第五十二天|300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
  • 使用 Hugging Face Transformer 微调 BERT
  • Vue原型对象
  • 向量数据库的分类概况
  • 工业镜头的类别
  • 实验11 SQL互联网业务查询-2
  • C++知识点梳理:C++ templates
  • uniapp form表单提交事件手动调用
  • Accelerate 0.24.0文档 三:超大模型推理(内存估算、Sharded checkpoints、bitsandbytes量化、分布式推理)
  • HackTheBox-Starting Point--Tier 2---Markup
  • android studio导入eclipse项目
  • 如何利用AI实现银行存量客户的营销?
  • springboot327基于Java的医院急诊系统
  • Unity3d 导入中文字体转TMPtext asset
  • 云积万相,焕发电商店铺新活力
  • 字典管理怎么使用,vue3项目使用若依的的字典管理模块
  • 【汇编】内存中字的存储、用DS和[address]实现字的传送、DS与数据段
  • 数据分析 - 分散性与变异的量度
  • Neo4j数据库介绍及简单使用
  • ubuntu 20.04安装 Anaconda教程
  • iframe渲染后端接口文件和实现下载功能
  • 广西建筑工地模板:支模九层桉木模板
  • java集合,栈
  • Ubuntu 20.04 LTS ffmpeg gif mp4 互转 许编译安装ffmpeg ;解决gif转mp4转换后无法播放问题
  • 【Nginx】使用nginx进行反向代理与负载均衡