【问题标题】:Parse x509 certificate string in node在节点中解析 x509 证书字符串
【发布时间】:2019-11-06 06:40:10
【问题描述】:

我需要使用 node.js 解析一个 x509 证书字符串(最好是通过加密 api 本地)。我需要这样做,以便获得一个包含证书到期日期的对象,这样我就知道何时自动更新它。

我不知道从哪里开始

这是我尝试解析的示例证书

-----BEGIN CERTIFICATE-----
MIIDqDCCApCgAwIBAgICKg8wDQYJKoZIhvcNAQELBQAwWjELMAkGA1UEBhMCVVMx
EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1NlYXR0bGUxJDAiBgNVBAoT
G2dldGFDZXJ0IC0gd3d3LmdldGFjZXJ0LmNvbTAeFw0xOTExMDYwNjMwNDNaFw0y
MDAxMDUwNjMwNDNaMIGJMQswCQYDVQQGEwJBVTELMAkGA1UECBMCU0ExGjAYBgNV
BAcTEVJvc3RyZXZvciBTQSA1MDAwMRAwDgYDVQQKEwdDb3JzdGV4MRcwFQYDVQQD
Ew5BbGJlcnQgTWFyYXNoaTEmMCQGCSqGSIb3DQEJARYXYWxiZXJ0bWFzaHlAb3V0
bG9vay5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCdPRTB3j6k
XeylM4Tf7+s7YtjnGgc8Zseh4nX22xpo+sE+pYvOLu4NexprToJ64Yi/SMmBk9u2
0EkrvhWVkA1n8VyU6Oh57Oeg7cDMkqoabJ2CJBn/Z5AF3xrE9GYoymGsfHThd6nQ
JD/HRcErWGyAEwbnNG5CpwySVrMHo2A5va4pDwiDqQAf5rNLP0swtV7Q6UC6eJXs
I5Gbv3bhD8i44DLkj6rbY8uWClhns5XSG5R+rTwoYHkLolLPLj6Em7QtJKPyDsp1
6lzsjLsgzmRixFDhqI3HUlGUnAu6gwwxvP53qhSUi88sKe4M37med5HSAxv+U7A9
rr1js4ey84/9AgMBAAGjSDBGMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgTw
MAsGA1UdDwQEAwIFIDAZBgNVHREEEjAQgg5BbGJlcnQgTWFyYXNoaTANBgkqhkiG
9w0BAQsFAAOCAQEAnXQAvyYE10bc5V9AsjT4x8xyI5AZ6su9OXEDuBFQi2UGvwtb
hhrBZ79Y3KfomXmwtHNVzo6V7dG+9yoDykaKb/Ub72VqF9ZKZArgglMFlGhAk90c
msxWGm7sHLBlt2yjkvnAtt1EtnbOtmuPNGOA7yALTN9/uzBPoTgkjuI1Fkb1uHc1
gynJpqrT0r/qJp0aDxO2SokWYzv/SRCfQTeLMZ5dctHWb8UnsEzt578zYmlDwVof
tOniZVO5TwnXCaWOPjG9XKbW6wHUyMWbulxM9SJUeIjFI2ipQuW8O7Vd94aEyH8o
lc8zFSWoNxamcoX+4ajrs9VbNXythJ91UAtvtA==
-----END CERTIFICATE-----

【问题讨论】:

    标签: node.js ssl ssl-certificate x509


    【解决方案1】:

    node-forge 包可以解析 X.509 证书并以对象形式返回解析后的证书,包括过期数据:

    const forge = require('node-forge')
    
    const cert = forge.pki.certificateFromPem(pem)
    
    cert.validity.notAfter // => 2020-01-05T06:30:43.000Z
    

    【讨论】:

    • 这个不支持ECC
    【解决方案2】:

    我需要同样的东西,但没有使用任何第 3 方。看来这是可以做到的:

    let tls = require('tls');
    let net = require('net');
    
    let secureContext = tls.createSecureContext({
      cert: yourPemCertificateString
    });
    
    let secureSocket = new tls.TLSSocket(new net.Socket(), { secureContext });
    
    let cert = secureSocket.getCertificate();

    这应该返回Certificate Object

    在此之后也应该调用secureSocket.destroy()。

    【讨论】:

      【解决方案3】:

      从 nodejs 15.6 开始,你最好使用标准的crypto 模块: https://nodejs.org/api/crypto.html#x509validto

      const crypto = require("crypto")
      const cert = new crypto.X509Certificate(fs.readFileSync('my.crt')))
      
      console.log(cert.validTo)
      // Gives 'Feb  4 10:37:22 2027 GMT'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-20
        • 2021-03-28
        • 1970-01-01
        相关资源
        最近更新 更多