惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Register - Security
The Register - Security
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
GbyAI
GbyAI
WordPress大学
WordPress大学
博客园 - 【当耐特】
月光博客
月光博客
Microsoft Security Blog
Microsoft Security Blog
宝玉的分享
宝玉的分享
Y
Y Combinator Blog
S
SegmentFault 最新的问题
B
Blog RSS Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
腾讯CDC
U
Unit 42
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
F
Fortinet All Blogs
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
Last Week in AI
Last Week in AI
Engineering at Meta
Engineering at Meta
D
DataBreaches.Net
C
Check Point Blog
G
Google Developers Blog
有赞技术团队
有赞技术团队
I
InfoQ
T
The Blog of Author Tim Ferriss
F
Full Disclosure
Help Net Security
Help Net Security
P
Palo Alto Networks Blog
G
GRAHAM CLULEY
T
Tenable Blog
Know Your Adversary
Know Your Adversary
N
Netflix TechBlog - Medium
H
Hacker News: Front Page
C
Cyber Attacks, Cyber Crime and Cyber Security
Project Zero
Project Zero
Latest news
Latest news
Recorded Future
Recorded Future
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
N
News | PayPal Newsroom
C
Cisco Blogs
T
Tor Project blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
S
Secure Thoughts
A
Arctic Wolf

博客园 - lovebanyi

Memory stream is not expandable 博客园密文招聘的解密 PInvoke在 2.0 3.0的时候正常 升级到4.0后出错。 不要进行过度设计,某一层存在真的有意义吗?是否可以更简单。 化繁为简 定义权限 Ajax加载子域跨站cookie丢失的问题. Exists 比Contains 慢非常多。 ValidationExpression="http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?" can not work - lovebanyi 支付系统会碰到的漏洞问题。 值类型引用类型List Remove 方法Remove不掉哪一个项。 流程变换与抽象 Compiler Error Message: CS1513: } expected 如何用好SVN的Branch EntityFramework Any 生成的sql语句超长。 Quartz 的SB问题 GetNextValidTimeAfter 输出和输出 时区 不同步,好傻的方法? 新的一家公司Web开发选择的控件是Dev Express 太烂了,发现项目结构也是混乱的。 使用lambda表达式对属性进行验证。 数据库连接字符串配置的流程改进 从解放劳动力来看未来的科技进程
微软Azure平台 cloud service动态申请证书并绑定证书碰到的坑
lovebanyi · 2017-03-30 · via 博客园 - lovebanyi

我们有一个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>