新开源HTML5单文件网页版ACME客户端,可在线申请(2)

不同证书颁发机构需要的操作不一定相同,请根据提示进行操作;Let's Encrypt直接到第二步操作,ZeroSSL由于他们的ACME服务对浏览器支持很不友好存在跨域问题,需要多操作几下(复制源码到他们服务地址页面中运行,消除跨域问题)。

选择证书颁发机构

第二步:证书配置,填写域名

在网页的第二步中填写需要申请证书的域名(支持多域名、通配符),和密钥等信息配置;不同证书颁发机构需要填写的配置不一定相同,请根据提示进行操作。

填写域名列表: 比如要给你的域名test123.com申请证书,在域名中可以直接填写:test123.com, *.test123.com,带了一个通配符,这申请出来的证书在test123.com、、app.test123.com等域名都可以使用。注意:如果需要xxx.app.test123.com这种域名也能使用,需增加填写*.app.test123.com类似这种才行。

证书私钥: 建议直接点击创建新的RSA私钥。

ACME账户私钥: 如果你之前申请过,建议填写之前用过的私钥,没有申请过也同样的创建新的RSA私钥。

ACME联系邮箱: 填写一个你常用的邮箱,证书颁发机构会在证书到期前给你推送邮件提醒续期,乱填邮箱收不到提醒。

EAB凭据: 有些ACME服务会要求提供外部账号绑定凭据(External Account Binding、externalAccountBinding、externalAccountRequired),比如ZeroSSL:你可以在ZeroSSL的管理控制台的 Developer 中获得此凭据,所以你需要先注册一个ZeroSSL的账号;Let's Encrypt没有此选项。

配置证书

第三步:完成域名所有权的验证

根据网页内显示的第三步内容,给每个域名配置好合适的域名所有权验证方式;常见的验证方式有:DNS解析中配置TXT记录进行验证、上传文件到服务器进行验证,通配符域名一般仅支持DNS验证;等全部配置完成后开始验证,验证通过后就能下载得到证书了。

推荐使用DNS验证方式,只需要登录你的域名解析管理后台,在域名解析中填写子域名TXT记录就行,简单快捷,并且不容易出错;比如*.test123.com,我们需要给子域名_acme-challenge.test123.com添加一条TXT记录(这一个子域名下可以添加多条TXT记录)。

通过上传文件来验证,不太推荐这个方式,因为必须要有服务器,不然ACME访问不到文件就会验证不通过;为了让上传的文件能正常访问,可能需要在服务器内进行一些配置(请自行搜索解决办法),测试URL地址你自己也能正常访问后,才能开始验证。

验证域名所有权

第四步:下载保存证书PEM文件

等域名所有权验证通过后,网页会显示第四步,提供证书文件下载,下载保存好;有3个文件需要下载(都是纯文本,可以用记事本打开):

证书文件(含完整证书链)

证书私钥文件

日志记录文件,下次申请时直接拖拽此文件进页面,自动填写相同配置

证书文件的后缀.pem可以改成.crt或.cer,这样在Windows里面可以直接双击打开查看此证书。

最后将下载保存的证书和私钥配置到你的网站中即可,不同系统程序的配置方法不同,请自行查找对应配置方法。

下载保存证书

源码中一些可以把玩的代码

为了在浏览器上实现RSA、ECC签名操作,源码中用纯js代码实现了:

PKCS#1的解析,PEM格式公钥和私钥

PKCS#8的解析和生成,PEM格式公钥和私钥

PKCS#10的生成,PEM格式证书请求CSR文件(Certification Request)

对应的功能封装在本客户端内的 X509 对象中,用 X509.CreateCSR 来生成CSR,用 X509.KeyGenerate 来创建PEM格式密钥,用 X509.KeyParse 来解析PEM格式密钥,用 X509.KeyExport 来导出PEM格式密钥。

这些功能都是根据相应的标准用js代码在二进制层面上实现的,二进制数据操作封装在了 ASN1 对象中:实现了 ASN.1 标准的二进制解析和封包,使用 ASN1.ParsePEM 方法可以解析任意的PEM格式密钥或证书。

请打开本网页客户端,在浏览器控制台内执行一下代码观赏:

console.log("生成一个512位的RSA私钥 PKCS#8:"); X509.DefaultType2_RSA="512"; privateKey=await new Promise(function(resolve,reject){ X509.KeyGenerate("RSA", function(pem){resolve(pem)}, function(err){reject(new Error(err))}) }); console.log(privateKey); console.log("解析一个pem格式密钥:"); keyInfo=await new Promise(function(resolve,reject){ X509.KeyParse(privateKey, function(info){resolve(info)}, function(err){reject(new Error(err))}) }); console.log(keyInfo); console.log("导出私钥的公钥 PKCS#8:"); publicKey=X509.KeyExport(keyInfo, true); console.log(publicKey); console.log("用私钥创建一个证书请求CSR PKCS#10:"); csr=await new Promise(function(resolve,reject){ X509.CreateCSR(keyInfo, "test123.com" , ["test.com","*.test.com","*.app.test.com","test123.com","*.test123.com"] , function(csr){resolve(csr)}, function(err){reject(new Error(err))}) }); console.log(csr); console.log("用ASN1解析CSR得到二进制结构:"); csrASN1=ASN1.ParsePEM(csr); console.log(csrASN1); console.log("用ASN1解析私钥得到二进制结构:"); privateKeyASN1=ASN1.ParsePEM(privateKey); console.log(privateKeyASN1); console.log("用ASN1解析公钥得到二进制结构:"); publicKeyASN1=ASN1.ParsePEM(publicKey); console.log(publicKeyASN1);

【END】

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zggpfw.html