通過ServerManager類對iis進(jìn)行相對應(yīng)的操作(包括建立站點,程序池,綁定域名之類,這里不詳細(xì)解釋,網(wǎng)上有很多這方面的資料),我就想既然可以手動在iis創(chuàng)建域名并綁定ssl證書,那應(yīng)該也有對應(yīng)的實現(xiàn)方法,果然找到了里面的一個方法,貼上代碼先
ServerManager sm = new ServerManager();
string bindingInformation = "*:" + port + ":" + bindingDomainName;
sm.Sites[webName].Bindings.Add(bindingInformation, certificateHash, certificateStoreName);
bindingInformation應(yīng)該不用解釋,一眼就看到是綁定的端口和域名, certificateHash和certificateStoreName又是什么呢?certificateHash參數(shù)類型是byte[],而certificateStoreName參數(shù)類型是string,通過直接百度翻譯得到的結(jié)果是證書散列和證書,正在思考他們的來源時,突然想到購買ssl證書之后提供給我們的相關(guān)文件和秘鑰,應(yīng)該和這里大有關(guān)聯(lián),通過查詢一些資料,得知certificateHash(證書散列)是通過.pfx文件獲取而來的,而certificateStoreName則是證書名稱,這里貼上完整的代碼
// <summary> /// 增加綁定域名(ssl) /// </summary> /// <param name="webName">站點名稱</param> /// <param name="port">端口</param> /// <param name="bindingDomainName">綁定域名</param> public void AddHostHeaderSSL(string webName, string port, string bindingDomainName) { //**pfxPath**是指提供給你的.pfx文件的路徑,購買ssl之后他會提供給你相關(guān)的文件,里面有多個文件 //一般包含apache文件夾,iis文件夾,nginx文件夾,我使用的是iis部署,所以.pfx文件在iis文件夾里面 //**certPwd**是指購買ssl之后提供給你的秘鑰 string pfx = Directory.GetFiles(pfxPath, "*.pfx", SearchOption.AllDirectories).FirstOrDefault(); var store = new X509Store(StoreName.AuthRoot, StoreLocation.LocalMachine); store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite); var certificate = new X509Certificate2(pfx, certPwd, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet); store.Add(certificate); store.Close(); var certificateStoreName = store.Name; //綁定的證書名稱 var certificateHash = certificate.GetCertHash(); //證書內(nèi)容 ServerManager sm = new ServerManager(); string bindingInformation = "*:" + port + ":" + bindingDomainName; sm.Sites[webName].Bindings.Add(bindingInformation, certificateHash, certificateStoreName); sm.CommitChanges(); }
至此,動態(tài)綁定ssl證書的功能就實現(xiàn)了
以下示例演示CertificateHash屬性。如果協(xié)議標(biāo)識符為“https”,則顯示證書哈希和證書庫名稱。此代碼示例是為Binding類提供的更大示例的一部分。
if (binding.Protocol == "https"){ // There is a CertificateHash and // CertificateStoreName for the https protocol only. bindingdisplay = bindingdisplay + "\n CertificateHash: " + binding.CertificateHash + ": "; // Display the hash. foreach (System.Byte certhashbyte in binding.CertificateHash) { bindingdisplay = bindingdisplay + certhashbyte.ToString() + " "; } bindingdisplay = bindingdisplay + "\n CertificateStoreName: " + binding.CertificateStoreName;}
vb.net
If (binding.Protocol = "https") Then ' There is a CertificateHash and ' CertificateStoreName for the https protocol only. bindingdisplay = (bindingdisplay + (""& vbLf&" CertificateHash: " _ + (binding.CertificateHash + ": "))) ' Display the hash. For Each certhashbyte As Byte In binding.CertificateHash bindingdisplay = (bindingdisplay _ + (certhashbyte.ToString + " ")) Next bindingdisplay = (bindingdisplay + (""& vbLf&" CertificateStoreName: " + binding.CertificateStoreName)) End If
如對本文有疑問,請?zhí)峤坏浇涣髡搲瑥V大熱心網(wǎng)友會為你解答?。?點擊進(jìn)入論壇