问题:如何从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
答案 0 :(得分:0)
罪魁祸首似乎是decodeURI
。最明显的提示是证书中的每一行都应具有相同的最大长度,即64个字符。使用decodeURIComponent
解决了这个问题。
将decodeURIComponent
封装在try-catch语句中可能也很好。