如何传递base64字符串作为Openssl的输入证书?

时间:2019-05-09 04:39:27

标签: node.js linux shell openssl sh

我有一个正在拿到证书的证书。我只希望该字符串在openssl命令中直接作为-in传递。

但是我在openssl中看不到任何方法,您能帮忙吗?

我的代码

const { exec } = require('child_process');

        exec('openssl x509 -noout -issuer -in '+certificateString , (err, stdout, stderr) => {
        if (err) {
            console.log(err);
        }else{
            console.log(studout);
        }
        });

如果我直接通过证书文件url,则可以正常工作

  

openssl x509 -noout -issuer -in certificate.pem

这项工作

但是我如何直接在openssl中传递证书字符串?

有帮助吗?

1 个答案:

答案 0 :(得分:1)

首先,您是否拥有base64或PEM?那些不是同一回事。尽管PEM 包括 base64,但它不是 only base64。如果您有一个适用于openssl x509 -in file的文件,则它是PEM,仅base64。人们似乎在看PEM,看到40多个base64字符,他们的大脑关闭并且无法看到破折号-BEGIN行,破折号END行和换行符,所有这些都是必需的。

第二,certificate.pem是文件名或路径名,而不是URL。文件名或路径名不是URL,URL不是文件名或路径名,尽管 some URL方案(尤其是大多数人注意到的唯一方案)包括一些与pathname相同的元素。

输入到openssl x509的证书必须是(命名)文件或标准输入(通常缩写为stdin)。如果您不想将其作为命名文件提供,则nodejs可以将数据提供给孩子的stdin,但不能使用更高级别的exec*方法,只能提供更基本的spawn

const{ spawn } = require('child_process');
const pem = `-----BEGIN CERTIFICATE-----
MIIDUzCCAjugAwIBAgIJANK2Ysp8bp+6MA0GCSqGSIb3DQEBCwUAMEAxCzAJBgNV
BAYTAlVTMQswCQYDVQQIDAJDQTETMBEGA1UEBwwKVGluc2VsdG93bjEPMA0GA1UE
CgwGRGlzbmV5MB4XDTE5MDUwOTA5MTQ0NVoXDTIwMDUwODA5MTQ0NVowQDELMAkG
A1UEBhMCVVMxCzAJBgNVBAgMAkNBMRMwEQYDVQQHDApUaW5zZWx0b3duMQ8wDQYD
VQQKDAZEaXNuZXkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCuKNJI
oBJ6acFSqMlG6e6WS44jC0RP+2y0q+02P4xc9BIuPjKV6/Lkg3bnYenAzktemvc7
EVFOUS/Ema4UIc+aDtSpjAegWnZNrzX+K76Xxzw+RnZalXB1Z++CpTdtsgSmkrmR
wJ7ZZpclAK+Yt6Ggx9ea3/d8WJ85V30ezcG7hPf5BrCSxzjSPsxG3heDPh1/X0zk
H7PD0JB+IW08yOikLmQNZeTZXaIAaSXoIPj5L9Ax7kyDEiDcSBIcQbPGMfIG6CPO
hKOM4yZKWni0mO9jwgfYNU6Bxei35/KTVwBWXHck9N7DdEtoST9THYO7ZFqqvTdk
mLfBpsPXorFT+vAVAgMBAAGjUDBOMB0GA1UdDgQWBBQyXFJDoapFe4JaZBD1xVYE
ImDj7DAfBgNVHSMEGDAWgBQyXFJDoapFe4JaZBD1xVYEImDj7DAMBgNVHRMEBTAD
AQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAwFXI13uxhGz+fem7N03r0+dnNaXZQQ9CR
owTHVVOjsfrsbFPhKdZIKMKeqpc1AksqynhbV2zY5VjINMab8ADw165gTCgy8/0S
X3QQsy2P5RNx/YuRMvs6hP7ZhZQlabLVbBnCWqAevT2qEZ7Gmi+m9A9sdK2Hsrkj
0lxGCozscme7E3ZfR/3GQVzyfZVppRLsgIth9F2y6SyLXwi+v39C+a9vdZjMS3Uy
HuRD9Sk8xydWywI8wKBlfnX4KGMBjKpSDpMeb6723eXuPC+soUBafuUoP+fWqjg4
LFgYg1TtyzfdrkkWZ9/KxS47OxkF6BAQtFGVF2nNgcpdXxToK7pP
-----END CERTIFICATE-----
`;
const p = spawn("/path/to/openssl", ["x509","-noout","-issuer"]);
// options.stdio defaults to ['pipe','pipe','pipe'] 
p.stdout.on('data',(data)=> {console.log(data.toString())} );
p.stderr.on('data',(data)=> {console.log("ERROR:"+data.toString())} );
p.on('close',()=> {} );
p.stdin.write(pem); p.stdin.end();

但是,您无需运行外部程序即可解析证书;有很多JS库可以做到这一点。例如,第二个npmjs为我找到了:

const { Certificate } = require('@fidm/x509');
const { ASN1 } = require('@fidm/asn1');
var iss = Certificate.fromPEM(pem).issuer.attributes;
var s = ""; for(var a of iss){ s += "/" + a.shortName + "=" + a.value; }
console.log(s);

如果您确实有base64而不是PEM,请用

替换第三行
const bin = Buffer.from(b64,'base64');
var iss = new Certificate(ASN1.fromDER(bin)).issuer.attributes;