我们有一个saas平台 部分在azure的cloud service 使用lets encrypt来申请证书。每一个商家申请域名之后就需要通过Lets encrypt来得到证书并绑定证书。

主要碰到的两个问题。

第一个:我们是使用 AcmeClient (类库 https://github.com/ebekker/ACMESharp 示例项目 https://github.com/Lone-Coder/letsencrypt-win-simple/) 来申请证书的。发现这个申请的时候会碰到“urn:acme:error:badNonce” 这样的出错消息
解决的方法是每次申请一个新证书的进候是需要重新实例化这个类的。

第二是: 动态绑定证书的时候会导致原来的证书失效,或者新申请的证书绑定错误。

这个是因为 配置文件ServiceDefinition.csdef没有办法设置SNI, 我们在代码里面强制把它设成SNI也会出错。(IIS打开的时候会看到SNI是没有勾选的) 。而如果把https的绑定全部取消掉,又会导致https的端口也被关闭掉。

后面想的是添加一个空的绑定然后删掉这个空的绑定。 这样有时候还是会出错。

最后的想法是添加一个空的的绑定,还有一个没用的绑定。 删掉空的绑定。到目前以止工作正常。

如何安装证书,IIS能用的证书是放在localMachine的 WebHosting 或者 My下面 (运行MMC 添加证书管理可以看到这个东西)

代码是使用 X509Store 的Add方法。

X509Store _store;
try
{
_store = new X509Store("WebHosting", StoreLocation.LocalMachine);
_store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite);
}
catch (CryptographicException)
{
_store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
_store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite);
} var keyStoreFlags = X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable;
var pfxPath =""; //证书的路径
var host ="";//证书的 host
certificate = new X509Certificate2(pfxPath, AppConfig.CertificatePassword, keyStoreFlags);
certificate.FriendlyName = host;
_store.Add(certificate);

  

如何使用代码绑定证书

我们是把代码放在webRole的OnStart 方法里面。 并使用ServerManager类 .(Microsoft.Web.Administration.dll)

大概代码是

                    var serverManager = new ServerManager();
var site = serverManager.Sites[0];
var bindings = site.Bindings.ToList();
foreach (var item in canBindCertificates)
{
var httpsBinding = bindings.FirstOrDefault(it => it.Protocol == "https" && it.Host == item.FriendlyName);
if (httpsBinding != null)
{
httpsBinding.CertificateStoreName = _store.Name;
httpsBinding.CertificateHash = item.GetCertHash();
}
else
{
var binding = site.Bindings.Add($"*:443:{item.FriendlyName}", item.GetCertHash(), _store.Name);
binding.Protocol = "https";
binding.SetAttributeValue("sslFlags", 1); //Important property
}
}
serverManager.CommitChanges();

serverManager.CommitChanges();//要保证只有一个线程在跑。不然的话会出错

配置文件里面绑定的示例

<Sites>
<Site name="Web">
<Bindings>
<Binding name="Endpoint1" endpointName="Endpoint1" />
<Binding name="HttpsEndpointEmpty" endpointName="HttpsEndpoint1" hostHeader="" />
<Binding name="HttpsEndpoint1" endpointName="HttpsEndpoint1" hostHeader="placeholder.{xxx}.com" />                 //{xxx}是你自己的域名
</Bindings>
</Site>

微软Azure平台 cloud service动态申请证书并绑定证书碰到的坑的更多相关文章

  1. 跟我学Windows Azure 四 Cloud Service中的WebRole与WorkRole,及他们之间的通信

    Cloud Service 中WebRole就相当与我们的WebSite,而WorkRole相当与我们在服务器上写了个Windows Service,站在高可用的角度上来讲,Cloud Service ...

  2. Azure一个Cloud Service支持多个公网地址

    Azure刚刚发布在同一个Cloud Service下支持多个公网IP地址的功能. 这个功能主要是用于: 当相同的端口需要公用相同的LoadBalance时. 比如: 一种使用场景是多组Web服务器被 ...

  3. Windows Azure Cloud Service (38) 微软IaaS与PaaS比较

    <Windows Azure Platform 系列文章目录> 最近一直想总结Azure IaaS和PaaS的区别与比较,写个博文详细说明一下.建议读者在阅读之前,先熟悉微软PaaS和Ia ...

  4. Azure China (3) 使用Visual Studio 2013证书发布Cloud Service至Azure China

    <Windows Azure Platform 系列文章目录> 之前有很多网友询问我如何通过VS发布Cloud Service至Azure China,这里我专门写篇文章,给大家详细介绍下 ...

  5. Windows Azure Cloud Service (36) 在Azure Cloud Service配置SSL证书

    <Windows Azure Platform 系列文章目录> 在某些时候,我们需要在Azure PaaS Cloud Service配置HTTPS连接.本章将介绍如何在本地创建证书,然后 ...

  6. 在Azure Cloud Service中部署Java Web App(1)

    Microsoft Azure是一个开放的,灵活的云平台,除了对自家的.Net平台有良好的支持外,对于各种开源的软件,语言,工具,框架都有着良好的支持,比如Java,Php,Python等等,你可以使 ...

  7. windows azure Vm、cloud service、web application 如何选择可用的服务

    windows azure 的web应用和虚拟机都经常用.我们经常把我们的网站部署上去.一般选择web应用或者开一个虚拟机.开一个虚拟机就会按照虚拟机的使用时间进行计费. 那么我们选择web部署在哪里 ...

  8. Visual Studio 2013发布Cloud Service至Azure China

    Visual Studio 2013发布Cloud Service至Azure China <Windows Azure Platform 系列文章目录> 之前有很多网友询问我如何通过VS ...

  9. 如何使用 OneAPM 监控微软 Azure Cloud Service ?

    不知不觉微软 Azure 已经进入中国市场近两年的时间.那么 Azure 平台的性能究竟如何?资源加载的延迟.虚拟机的稳定性等问题是否切实满足客户期许.这些都是大家对微软 Azure 这个国外的云服务 ...

随机推荐

  1. Repeat a string repeat a string

    重要的事情说3遍! 重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串. 这是一些对你有帮助的资源: Global String Object 这道题的思路就是按照题目要求一步一步 ...

  2. JavaWeb过滤器——登录过滤

    一般来说简单且常用的过滤器使用方法,我觉得除了配置字符编码的过滤之外就是登录器的过滤了 登录过滤器的主要过程可以 一句话来概括:首先在登录的时候把指定好的标志放在session中,操作过滤的时候根据s ...

  3. jinfo用法说明

    以下几种用法 -flags pid :打印当前VM的参数 -flag <name> pid:打印指定JVM的参数值 -flag [+|-]<name> pid:设置指定JVM参 ...

  4. 天气预报api整理

    目录 1.国家气象局提供的天气预报接口 1.1.接口网址 1.2.示范代码 2.各个城市对应的代码 作为一个开发的diaosi,在开发过程中,时常会遇到添加天气的功能,现在百忙之中抽出一点时间整理了一 ...

  5. dpkg: 处理归档 /var/cache/apt/archives/swig2.0_2.0.12-1ubuntu4_amd64.deb (--unpack)时出错:

    问题: sudo apt-get upgrade 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 正在计算更新... 完成下列软件包的版本将保持不变: lib ...

  6. 《Drools7.0.0.Final规则引擎教程》第4章 4.4 约束(Pattern的一部分)

    4.4.3 约束(Pattern的一部分) 前面我们已经介绍了条件约束在Pattern中位置了,那么什么是条件约束呢?简单来说就是一个返回true或者false的表达式,比如下面的5小于6,就是一个约 ...

  7. Android 你可能忽略的提高敲代码效率的方式

    Android 你可能忽略的提高敲代码效率的方式

  8. SQL基础四(例子)

    ------------------------------------------------ --分别创建student/course/score表 Create table student ( ...

  9. MySQL 存储过程,游标,临时表创建

    -- -------------------------------------------------------------------------------- -- Routine DDL - ...

  10. .NET Web开发技术简单整理 转

    .NET Web开发技术简单整理 原文:http://www.cnblogs.com/SanMaoSpace/p/3157293.html 在最初学习一些编程语言.一些编程技术的时候,做的更多的是如何 ...