如何在NodeJS中解码X.509主题(从客户端证书)

时间:2019-04-15 17:37:52

标签: node.js ssl x509certificate

问题:如何从NodeJS中的证书字符串中解码X.509主题数据?

背景

使用Nginx作为反向代理时,我可以使用以下设置让Nginx验证客户端证书:

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    ssl on;
    ssl_certificate        /path/to/bundle.crt;
    ssl_certificate_key    /path/to/server.key;
    ssl_client_certificate /path/to/client_certificates.crt;
    ssl_verify_client      optional_no_ca;
    ssl_verify_depth       2;

    ssl_protocols TLSv1.1 TLSv1.2;
    ssl_session_cache shared:SSL:20m;
    ssl_session_timeout 60m;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DHE+AES128:!ADH:!AECDH:!MD5';

    server_name some_server;
    root /path/to/www;

    location /api/ {
        proxy_pass         http://my_api_server:1234/;
        proxy_http_version 1.1;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;
        proxy_set_header   X-SSL-CERT $ssl_client_escaped_cert;
    }
}

现在这将填充标题,以便我可以在标题中检索证书:

let cert = req.headers['x-ssl-cert'];
cert = decodeURI(cert);
const interestingStuff = x509.getSubject(cert);

现在不幸的是,x509软件包似乎不允许cert成为字符串,或者我犯了某种错误。产生的错误是:Error: Context creation failed: File doesn't exist.: 233123-123123-123123

提示

issue暗示它需要正确的换行符,但运行JSON.stringify时看起来不错:"-----BEGIN CERTIFICATE-----\nASDWQESAD..\n..ASDASD\n-----END CERTIFICATE-----\n"

其他东西

注意:在不使用代理并直接在ca中配置https的情况下,当getPeerCertificate()返回带有subject元素。

此问题与以下部分相关:expressjs setting tls connect https nginx server for request

1 个答案:

答案 0 :(得分:0)

罪魁祸首似乎是decodeURI。最明显的提示是证书中的每一行都应具有相同的最大长度,即64个字符。使用decodeURIComponent解决了这个问题。

decodeURIComponent封装在try-catch语句中可能也很好。