生成線上用https證書(shū),支持通配符和多域名裙椭,初學(xué)Let’s Encrypt用于IIS躏哩,純本地手動(dòng)

自簡(jiǎn)書(shū)發(fā)布的上篇《生成本地測(cè)試用https證書(shū),支持通配符和多域名揉燃,初學(xué)OpenSSL》以來(lái)扫尺,本地測(cè)試用https用的妥妥的。

線上一直用的騰訊云的免費(fèi)證書(shū)(每個(gè)域名都要一個(gè)證書(shū)(滑稽)炊汤,今天線上用的通配符證書(shū)也搞定了正驻,實(shí)現(xiàn)了一個(gè)證書(shū)包含多個(gè)域名(多個(gè)泛域名)。

2019-10-8 更新:添加對(duì)gethttpsforfree網(wǎng)頁(yè)中所有RSA簽名進(jìn)行自動(dòng)簽名抢腐,提供的自動(dòng)簽名代碼在下面姑曙。

今年(2018)年初Let’s Encrypt已開(kāi)放了通配符證書(shū)的申請(qǐng)《Wildcard Certificates Coming January 2018》,目前只支持通過(guò)dns解析進(jìn)行驗(yàn)證氓栈。沒(méi)有通配符的證書(shū)時(shí)在心里感覺(jué)用起來(lái)會(huì)很累渣磷,一直沒(méi)有去嘗試。以前AlphaSSL的通配符證書(shū)倒是可以免費(fèi)申請(qǐng)授瘦,assl.loovit.net都已經(jīng)跳轉(zhuǎn)到別的地方了〈捉纾現(xiàn)在可以勇敢的去用Let’s Encrypt的通配符證書(shū)了。

官方并沒(méi)有簡(jiǎn)單易用的客戶端

申請(qǐng)環(huán)境:本地(線上不亂搞)提完,win7+Win32OpenSSL

Let’s Encrypt提供的客戶端列表包括開(kāi)源實(shí)現(xiàn)《ACME Client Implementations》形纺,電腦上能裝上的基本上都試了一下(捆綁生產(chǎn)環(huán)境的軟件不鳥(niǎo)),好幾個(gè)依賴高版本的.Net(勉為其難的裝了一下)徒欣,始終沒(méi)搞懂怎么耍逐样,入門到放棄。然后用C#調(diào)用了一個(gè)封裝好的接口試了一下,目測(cè)工作量也不小脂新,入門到放棄挪捕。

Let’s Encrypt 使用吐槽》這里面說(shuō)的比較贊同的一點(diǎn)這才是你真正需要的 acme-client ,只干申請(qǐng)證書(shū)這一件事的腳本争便。哈哈级零,其實(shí)發(fā)現(xiàn)申請(qǐng)證書(shū)只是簡(jiǎn)單的調(diào)用幾個(gè)api.letsencrypt.orgRESTful接口,并且都含有響應(yīng)頭Access-Control-Allow-Origin:*滞乙,就不去研究他們的文檔了奏纪,因?yàn)榉艘话愎倬W(wǎng),并沒(méi)有發(fā)現(xiàn)哪里有這種直接了當(dāng)?shù)奈臋n斩启。

Let’s Encrypt提供的網(wǎng)頁(yè)客戶端列表中的Get HTTPS for free https://gethttpsforfree.com/就是直接使用的接口序调,這個(gè)網(wǎng)站聲稱This website is static, so it can be saved and loaded locally. Just right-click and "Save Page As.."! 查看代碼確實(shí)是一個(gè)靜態(tài)網(wǎng)站。其他幾個(gè)網(wǎng)頁(yè)客戶端也稍微試了一下兔簇,有些要注冊(cè)還主動(dòng)幫你管理證書(shū)(不鳥(niǎo))发绢。其實(shí)一個(gè)靜態(tài)網(wǎng)頁(yè)也能夠?qū)崿F(xiàn)證書(shū)的申請(qǐng),還不用下載安裝各種環(huán)境垄琐,比較靠譜朴摊。

使用Get HTTPS for free申請(qǐng)證書(shū)

地址https://gethttpsforfree.com/
這個(gè)頁(yè)面使用起來(lái)很方便,因?yàn)樵撎崾镜牡胤蕉加刑崾敬寺牵凑仗崾咀鰶](méi)有壓力甚纲,順利申請(qǐng)到了兩個(gè)域名合在一起的證書(shū)。

主要要手動(dòng)做的事情:

  1. 創(chuàng)建兩個(gè)秘鑰朦前,一個(gè)賬戶秘鑰介杆,一個(gè)域名證書(shū)秘鑰(2048位,這個(gè)網(wǎng)站寫4096位感覺(jué)有點(diǎn)大韭寸,百度和Let’s Encrypt都是2048位)
  2. 創(chuàng)建證書(shū)申請(qǐng)請(qǐng)求
  3. 多次進(jìn)行文本內(nèi)容簽名(用賬戶秘鑰)

*. 申請(qǐng)好的證書(shū)制作成pfx文件導(dǎo)入IIS (我用IIS是要這一步的)

這些步驟都可以用腳本去處理春哨,點(diǎn)一下->復(fù)制粘貼,手動(dòng)也不比自動(dòng)差(其實(shí)也沒(méi)有便捷的全自動(dòng)恩伺,dns驗(yàn)證還是要手動(dòng)寫入TXT記錄)

使用到的腳本

下面這些文件全部是在同一個(gè)文件夾里面:
1.創(chuàng)建秘鑰.cmd,2.生成請(qǐng)求.ini,2.生成請(qǐng)求.cmd,3.簽名.cmd,3.簽名.txt,4.導(dǎo)出.cmd

文件名:1.創(chuàng)建秘鑰.cmd

@echo off

set /p isSet=創(chuàng)建秘鑰會(huì)覆蓋現(xiàn)有秘鑰赴背,確定要?jiǎng)?chuàng)建嗎?(y)
if not "%isSet%"=="y" goto end

echo 創(chuàng)建賬戶秘鑰
openssl genrsa -out key.account.private 2048
openssl rsa -in key.account.private -pubout -out key.account.public

echo 創(chuàng)建證書(shū)秘鑰
openssl genrsa -out key.domain.key 2048

:end
echo 結(jié)束
pause

文件名:2.生成請(qǐng)求.ini
這個(gè)文件是OpenSSL安裝目錄中的配置文件晶渠,copy過(guò)來(lái)改一下名字就行了凰荚,然后在文件結(jié)尾添加下面內(nèi)容,域名自己加(泛解析的要把一級(jí)域名加上褒脯,不加他們會(huì)不會(huì)自動(dòng)加不知道便瑟,目測(cè)不會(huì)自動(dòng)加)

[ ext ]
subjectAltName = @dns

[ dns ]
DNS.1 = baidu1.com
DNS.2 = *.baidu1.com
DNS.3 = baidu2.com
DNS.4 = *.baidu2.com

文件名:2.生成請(qǐng)求.cmd

@echo off

set /p isSet=需要先配置域名列表"2.生成請(qǐng)求.ini",配置好了嗎番川?(y)
if not "%isSet%"=="y" goto end

echo 生成請(qǐng)求
openssl req -new -sha256 -key key.domain.key -out domain.csr -subj "/" -reqexts ext -config 2.生成請(qǐng)求.ini

:end
echo 結(jié)束
pause

文件名:3.簽名.cmd

@echo off

set /p isSet=需要先寫入"3.簽名.txt"到涂,寫好了嗎脊框?(y)
if not "%isSet%"=="y" goto end

openssl dgst -sha256 -hex -sign key.account.private 3.簽名.txt

:end
echo 結(jié)束
pause

文件名:3.簽名.txt
這個(gè)文件是一個(gè)空文件,到時(shí)候有需要簽名的數(shù)據(jù)復(fù)制進(jìn)來(lái)運(yùn)行一下簽名.cmd就能快速獲得簽名践啄。

文件名:4.導(dǎo)出.cmd

@echo off

echo 導(dǎo)出pfx,請(qǐng)輸入密碼1
pause
openssl pkcs12 -export -out domain.pfx -inkey key.domain.key -in domain.crt

:end
echo 結(jié)束
pause

申請(qǐng)制作過(guò)程

  1. 所有文件準(zhǔn)備好后(尤其是2.生成請(qǐng)求.ini把域名配置好)浇雹,直接運(yùn)行1.創(chuàng)建秘鑰.cmd,然后直接運(yùn)行2.生成請(qǐng)求.cmd屿讽。
  2. 把生成的key.account.public填入網(wǎng)頁(yè)Account Public Key中箫爷。
  3. 把生成的domain.csr填入網(wǎng)頁(yè)Certificate Signing Request中。
  4. 根據(jù)網(wǎng)頁(yè)提示簽名請(qǐng)求聂儒,每次簽名的時(shí)候:把文本復(fù)制到3.簽名.txt(只要引號(hào)里面的文本內(nèi)容,其他內(nèi)容刪除)硫痰,然后運(yùn)行3.簽名.cmd得到簽名衩婚,把RSA-SHA256(3.簽名.txt)= XXXXX復(fù)制到網(wǎng)頁(yè)對(duì)應(yīng)位置。
  5. 根據(jù)提示設(shè)置域名dns TXT解析效斑,并完成驗(yàn)證非春。
  6. 把最后一步生成的證書(shū)內(nèi)容全部復(fù)制到新建的文件domain.crt中,域名證書(shū)就獲取成功啦缓屠。
  7. 額外的生成IIS用的pfx文件奇昙,運(yùn)行一下4.導(dǎo)出.cmd設(shè)置一下密碼就行了,我提示輸入1作為密碼敌完,是因?yàn)槲覒?滑稽储耐。

秀一波

證書(shū)域名

有效期

涉及到的文件

自動(dòng)簽名

我使用了 fszlin/certes 來(lái)編寫了一個(gè)C#客戶端用來(lái)申請(qǐng)多域名證書(shū),但經(jīng)常操作到最后這個(gè)庫(kù)老是拋出申請(qǐng)錯(cuò)誤信息滨溉,無(wú)奈每次手動(dòng)用gethttpsforfree都能一次性完成申請(qǐng)什湘。所以我就準(zhǔn)備丟棄certes,僅僅使用gethttpsforfree晦攒。

但gethttpsforfree每次簽名最繁瑣的就是RSA簽名部分闽撤,復(fù)制來(lái)復(fù)制去,由于前段時(shí)間在我的H5錄音庫(kù)xiangyuecn/Recorder內(nèi)實(shí)現(xiàn)了一個(gè)RSA簽名功能脯颜,因此直接拿過(guò)來(lái)給gethttpsforfree安裝上了自動(dòng)簽名功能哟旗。

我給gethttpsforfree的github把這個(gè)功能提交了一個(gè)issue(他們家關(guān)閉了wiki),作者就來(lái)了一句SPAM栋操。哈哈哈闸餐,自己好用就好,該做的我都做了矾芙,結(jié)果我才不管绎巨。https://github.com/diafygi/gethttpsforfree/issues/164 里面有詳細(xì)的自動(dòng)簽名介紹。

自動(dòng)簽名操作步驟:

  1. 打開(kāi) https://gethttpsforfree.com/頁(yè)面蠕啄。
  2. 復(fù)制下面的代碼到瀏覽器控制臺(tái)里面執(zhí)行场勤。
  3. 按頁(yè)面中的正常流程操作戈锻,填寫好私鑰,中途所有簽名操作都會(huì)自動(dòng)完成和媳。
(function(){

var privateSign=function(txt){
    //Signature
    try{
        var key=document.querySelector(".privateSignKey").value.replace(/-+.+?PRIVATE.+?-+|\s/g,"");
        var byts=Base64.decode(key);
        var asn1=ASN1.decode(byts);
        if(asn1.sub.length<9){//PKCS#8
            asn1=asn1.sub[2].sub[0];
        };
        var get=function(n){
            var item=asn1.sub[n];
            var start = item.stream.pos+item.header;
            var end = item.stream.pos+item.header+item.length;
            var hex = item.stream.hexDump(start, end);
            hex=hex.replace(/\s/g,"");
            hex=hex.replace(/^00/g,"");//type=02 INTEGER:Remove the highest bit-filled 0x00
            return RSA.HexToB64(hex);
        };
        var n=get(1);
        var e=get(2);
        var d=get(3);
        
        var rsa=RSA(n,e,d);
        var sign=rsa.sign(txt,"SHA256");
        if(!rsa.verify(txt,sign,"SHA256")){
            alert("private key seems to be wrong!");
            return "";
        };
        return RSA.B64ToHex(sign);
    }catch(e){
        console.error(e);
        alert("private key parse error!");
        return "";
    }
};

var install=function(){
    HTMLInputElement.prototype._setAttribute=HTMLInputElement.prototype.setAttribute;
    HTMLInputElement.prototype.setAttribute=function(k,v){
        var This=this;
        This._setAttribute.apply(This,arguments);
        
        if(!(k=="placeholder"&&v==RESULT_PLACEHOLDER)){
            return;
        };
        var signExec=function(){
            var find=This.parentNode.querySelectorAll("input");
            var arr=[];
            for(var i=0;i<find.length;i++){
                if(find[i].value.indexOf("openssl")+1){
                    arr.push(find[i]);
                };
            };
            if(arr.length!=1){
                alert("no input box for signature was found!");
                return;
            };
            This.value=privateSign(/"(.+)"/.exec(arr[0].value)[1]);
        };
        
        setTimeout(signExec,100);
        //blur exec
        This._setAttribute(k,"blur retry autofill sign. "+v);
        if(!This.isBindSignExec){
            This.isBindSignExec=true;
            This.addEventListener("blur",function(){
                if(This.value==""){
                    signExec();
                };
            });
        };
    };
    
    var div=document.createElement("div");
    div.innerHTML=`
        <div class="field">
            <div style="color:#0b1">Account Privete Key (RSA PKCS#1 or PKCS#8) (It's just for signature!):</div>
            <textarea class="privateSignKey" placeholder="-----BEGIN RSA PRIVATE KEY----- OR -----BEGIN PRIVATE KEY----- ..."></textarea>
        </div>
    `;
    validate_account.appendChild(div);
};

var script=document.createElement("script");
script.src="https://xiangyuecn.github.io/Recorder/assets/ztest-rsa.js";
script.onload=function(){
    setTimeout(function(){
        install();
    },1000);//emmm... doc was ready
};
document.querySelector("head").appendChild(script);

})();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末格遭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子留瞳,更是在濱河造成了極大的恐慌拒迅,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件她倘,死亡現(xiàn)場(chǎng)離奇詭異璧微,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)硬梁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門前硫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人荧止,你說(shuō)我怎么就攤上這事屹电。” “怎么了跃巡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵危号,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我素邪,道長(zhǎng)外莲,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任兔朦,我火速辦了婚禮苍狰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烘绽。我一直安慰自己淋昭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布安接。 她就那樣靜靜地躺著翔忽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盏檐。 梳的紋絲不亂的頭發(fā)上歇式,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音胡野,去河邊找鬼材失。 笑死,一個(gè)胖子當(dāng)著我的面吹牛硫豆,可吹牛的內(nèi)容都是我干的龙巨。 我是一名探鬼主播笼呆,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼旨别!你這毒婦竟也來(lái)了诗赌?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤秸弛,失蹤者是張志新(化名)和其女友劉穎铭若,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體递览,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叼屠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绞铃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镜雨。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖憎兽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吵冒,我是刑警寧澤纯命,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站痹栖,受9級(jí)特大地震影響亿汞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜揪阿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一疗我、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧南捂,春花似錦吴裤、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鞭缭,卻和暖如春剖膳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岭辣。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工吱晒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沦童。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓仑濒,卻偏偏與公主長(zhǎng)得像叹话,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子躏精,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容