• openssl命令行验证CA证书


    有一个指令叫做openssl verify,但真是难用。
    对于apache格式的CA证书,服务器端需要用户上传一个.key文件和一个.crt文件。
    下文中假如我的文件叫ca.key,ca.crt。
    找了很多资料,终于知道要这样写命令:

    openssl verify -CAfile ca.crt ca.crt

    对于用默认参数生成的crt文件确实可以校验,但是对于使用扩展指令生成的v3版crt就会报错。
    对于用户上传的证书能否验证我也表示怀疑。

     对于.key和.crt的相关性,也就是是否是一对,也得不到验证。

     基于上述原因,我决定读出关键信息,自己来验证。

    有效性及相关性验证

    • 如果能从ca.key和ca.crt中读出public key,我们可以认为ca.key和ca.crt是有效的文件。有效性得到了验证。
    openssl rsa -pubout -in ca.key
    返回内容如下:
    writing RSA key

    -----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxQDI12sYCMQR+V2hJTih
    UZIy70KYR1YF6Yt393nswK0m7pPAf7bMN1F8w8pcFcYF0g2HaKTEAQAPlWZVOD0i
    m2SYzDdm7gCx2AKYr40ijrSmzeis6SjTaBR7XljH5fFfnSkMTAXebnu2+LhIPtq+
    etj72v2KVuo9bQr4h41Wz4sIo3Ix2PkAFslPxv4j73rqGKBjezoLhXHjHbnryaNY
    icAOT+tI+GW7Hl7C33dJimGXmb3glI3qX7uxflFceV9Q3Bl3iFrzIGlA3kCdFwAz
    s1TiUDxJl1TqfnZlxyQgwWrYqlaMfteP1LngTj69xYHoBm8ML4PKlFpm4hvEt9eQ
    zQIDAQAB
    -----END PUBLIC KEY-----

    openssl x509 -pubkey -noout -in self.crt
    返回内容如下:

    -----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxQDI12sYCMQR+V2hJTih
    UZIy70KYR1YF6Yt393nswK0m7pPAf7bMN1F8w8pcFcYF0g2HaKTEAQAPlWZVOD0i
    m2SYzDdm7gCx2AKYr40ijrSmzeis6SjTaBR7XljH5fFfnSkMTAXebnu2+LhIPtq+
    etj72v2KVuo9bQr4h41Wz4sIo3Ix2PkAFslPxv4j73rqGKBjezoLhXHjHbnryaNY
    icAOT+tI+GW7Hl7C33dJimGXmb3glI3qX7uxflFceV9Q3Bl3iFrzIGlA3kCdFwAz
    s1TiUDxJl1TqfnZlxyQgwWrYqlaMfteP1LngTj69xYHoBm8ML4PKlFpm4hvEt9eQ
    zQIDAQAB
    -----END PUBLIC KEY-----

    • 如果两个文件中读出的public key的值相等,则可以认为两个文件是成对的。相关性得到了验证

    有效期验证

    openssl x509 -in ca.crt -noout -dates

    返回内容如下:

    notBefore=May 8 03:29:36 2021 GMT
    notAfter=May 6 03:29:36 2031 GMT

    只需要从上述字符串中解析出启止时间,然后和当前系统时间做比较,判断是否在有效期内就好。

    下面是我用python写的示例代码:

     
    import datetime
    import re
    
    info = '''
    notBefore=May  8 03:29:36 2021 GMT
    notAfter=May  6 03:29:36 2031 GMT
    '''
    
    print(info)
    str_before = re.search(r'notBefore=(.+)',info)
    print(str_before.group(1))
    timestamp_before = datetime.datetime.strptime(str_before.group(1),'%b %d %H:%M:%S %Y %Z').timestamp()
    str_after = re.search(r'notAfter=(.+)',info)
    print(str_after.group(1))
    timestamp_after = datetime.datetime.strptime(str_after.group(1),'%b %d %H:%M:%S %Y %Z').timestamp()
    
    utc_now = datetime.datetime.utcnow()
    print(utc_now)
    timestamp_now = utc_now.timestamp()
    
    if timestamp_now >= timestamp_before and timestamp_now <= timestamp_after:
        print('ACK')
    else:
        print('NAK')
  • 相关阅读:
    Vue- 对象语法 v-bind:class与对象语法的使用(重要)
    关于vue中$emit事件问题
    深入理解vue.js2.0指令v-for使用及索引获取
    到底vuex是什么?
    Vue.js学习系列二 —— vuex学习实践笔记(附DEMO)
    前端HTML5几种存储方式的总结
    JSON和JS对象之间的互转
    Vue2.0子父组件通信
    C#字符串和16进制转换
    C#中int32 的有效值范围
  • 原文地址:https://www.cnblogs.com/real-bert/p/14744300.html
Copyright © 2020-2023  润新知