首页 > 解决方案 > 如何将 base64 字符串作为 Openssl 的输入证书传递?

问题描述

我有一个证书,我在 string 中获得。-in我只想像在 openssl 命令中那样直接传递该字符串。

但我在 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 中传递证书字符串?

有什么帮助吗?

标签: node.jslinuxshellopensslsh

解决方案


首先,你有base64还是PEM?这些不是一回事。虽然 PEM包含base64,但它不仅仅是base64。如果您有一个可以使用的文件,openssl x509 -in file那么它是 PEM,而不仅仅是base64。人们似乎看着 PEM,看到了 40 多个 base64 字符,然后他们的大脑就关闭了,无法看到破折号-BEGIN 行、破折号-END 行和换行符,所有这些都是必需的。

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

证书输入openssl x509必须是(命名的)文件或标准输入(通常缩写为标准输入)。如果您不想将其作为命名文件提供,nodejs可以将数据提供给孩子的标准输入,但不能使用更高级别的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;

推荐阅读