标签 https 下的文章

.Net Core 2.0的坑——POST提交HTTPS时证书报错的问题

最近接入腾讯云的短信平台,平台的接口是HTTPS的,开发环境是Windows,而生产环境是Linux(CentOS)。在开发调试的时候都正常通过,没问题;而部署到CentOS上之后,会报System.PlatformNotSupportedException: The handler does not support custom handling of certificates with this combination of libcurl (7.29.0) and its SSL backend ("NSS/3.34").错误。这个问题在网上找了一圈,好不容易Google到一个俄文的Blog,里面给出了一个解决方法,但是博主特别强调了一下,这是一个非常糟糕的方法:

yum update
yum install openssl-devel gcc
wget https://curl.haxx.se/download/<latest>.tar.gz
tar -zxf <latest>.tar.gz
cd <latest>
./configure --prefix=/usr/local/curl/ --without-nss --with-ssl=/usr/local/ssl/
make && make install 
 
echo '/usr/local/curl/lib' > /etc/ld.so.conf.d/libcurl.conf && ldconfig 

https://curl.haxx.se/download/<;latest>.tar.gz 是curl的最新版本下载地址,目前是
https://curl.haxx.se/download/curl-7.60.0.tar.gz
之后就可以正常提交了。
感谢原作者提供的方法,原博客:https://ales79.blogspot.com/2018/06/centos-7-libcurl-with-openssl-backend.html

我使用的Post方法如下:

        public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            //直接确认,否则打不开    
            return true;
        }

        /// <summary>
        /// Post提交数据
        /// </summary>
        /// <param name="data">数据</param>
        /// <param name="url">目标地址</param>
        /// <param name="contentType">数据类型</param>
        /// <param name="charset">编码</param>
        /// <returns></returns>
        public static string Post(string data, string url,string contentType,string charset= "utf-8")
        {
            System.GC.Collect();//垃圾回收,回收没有正常关闭的http连接

            string result = "";//返回结果

            int timeout = 30;
            HttpWebRequest request = null;
            HttpWebResponse response = null;
            Stream reqStream = null;

            try
            {
                //设置最大连接数
                ServicePointManager.DefaultConnectionLimit = 200;                
                //设置https验证方式
                if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
                {
                    ServicePointManager.ServerCertificateValidationCallback =
                            new RemoteCertificateValidationCallback(CheckValidationResult);
                }

                /***************************************************************
                * 下面设置HttpWebRequest的相关属性
                * ************************************************************/
                request = (HttpWebRequest)WebRequest.Create(url);

                request.Method = "POST";
                request.Timeout = timeout * 1000;

                ////设置代理服务器
                //WebProxy proxy = new WebProxy();                          //定义一个网关对象
                //proxy.Address = new Uri(WxPayConfig.PROXY_URL);              //网关服务器端口:端口
                //request.Proxy = proxy;

                //设置POST的数据类型和长度
                request.ContentType = $"{contentType};charset={charset}";
                byte[] res = System.Text.Encoding.GetEncoding(charset).GetBytes(data);
                request.ContentLength = res.Length;

                //往服务器写入数据
                reqStream = request.GetRequestStream();
                reqStream.Write(res, 0, res.Length);
                reqStream.Close();

                //获取服务端返回
                response = (HttpWebResponse)request.GetResponse();

                //获取服务端返回数据
                StreamReader sr = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding(charset));

                result = sr.ReadToEnd().Trim();
                sr.Close();
            }
            catch (System.Threading.ThreadAbortException e)
            {
                System.Threading.Thread.ResetAbort();
            }
            catch (WebException e)
            {
                if (e.Status == WebExceptionStatus.ProtocolError)
                {
                    
                }
            }
            catch (Exception e)
            {
                
            }
            finally
            {
                //关闭连接和流
                if (response != null)
                {
                    response.Close();
                }
                if (request != null)
                {
                    request.Abort();
                }
            }
            return result;
        }

IIS服务器域名证书续订

我们知道,在Windows的IIS服务器上,使用域名证书开启HTTPS并不是非常方便,在IIS 7.5及之前的版本上,添加HTTPS站点时,并不能指定主机头(即域名),需要加完之后,到IIS的配置文件中去修改配置,增加了一定的难度;而且如果之后相关的配置有变动,也可能会影响到之前的HTTPS站点,有很多坑。而域名证书到期,需要换证书的话,如果之前添加过很多个HTTPS站点,都会受到影响,需要一个一个的站点重新选择证书,重新修改IIS的配置文件,是一个让人头疼的操作。
那如果是域名证书到期了,有没有什么办法可以简化我们的操作呢?答案是有的,那就是使用证书续订操作。
证书续订,需要的证书格式是cer的,我们以从阿里云上申请的通配符域名证书为例来说一下。从阿里云后台下载下来的域名证书格式,有pem和pfx格式的,唯独没有cer格式的,需要自己转换一下。下面先说下格式转换吧:
pem转cer,需要使用openssl,另外需要key文件。一共需要进行3次转换操作,才能转成cer格式:
1.先从pem转到p12,之后需要设置密码:

OpenSSL> pkcs12 -export -out a.p12 -in 1.pem -inkey 1.key
Loading 'screen' into random state - done
Enter Export Password:
Verifying - Enter Export Password:

2.从p12转为crt格式,输入第1步设置的密码:

OpenSSL> pkcs12 -in a.p12 -out b.crt -nokeys -clcerts
Enter Import Password:
MAC verified OK

3.最后一步,从crt转为cer:

OpenSSL> x509 -inform pem -in b.crt -outform der -out c.cer
OpenSSL>

pem2cer.png
使用OpenSSL进行证书格式转换

格式转完之后,把生成的cer文件上传到服务器,随便找个地方放着。打开IIS管理器,选中IIS管理器的网站根,在右侧功能区,打开IIS下的“服务器证书”
1.png
打开服务器证书

选中要续订的证书,之后点击右侧栏的“续订”
2.png
选择续订

打开“续订现有证书”对话框,选择最后一项:“完成证书续订申请”
3.png
完成证书续订申请

选择我们转换为cer的新证书
4.png
选择证书

点击“完成”按钮,完成续订申请
5.png
完成

之后就已经完成了,我们随便打开一个https网站,查看下证书详情,会发现过期日期已经是最新的了。

Windows版OpenSSL下载:点击下载OpenSSL

在Apache下bW博客强制访问HTTPS

HTTPS已经是大势所趋了,而国内的网络环境更需要尽早的使用HTTPS,因为运营商太流氓,像DNS劫持什么的都是家常便饭了,如果运营商的DNS劫持系统被黑,黑客利用这个系统给网站加上点什么恶意代码,那损失就更大了。下面就说下在bW下,怎样强制访问https。
如果已经开启了伪静态(使用官方的规则),那么请使用下面的.htaccess文件内容:

RewriteEngine on
RewriteBase /

# RewriteCond %{REQUEST_FILENAME} -f [OR]
# RewriteCond %{REQUEST_FILENAME} -d
# RewriteRule ^.*$ - [L]

RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

RewriteRule ^index/([0-9]+)/?$ index.php/$1/ [QSA,L]
RewriteRule ^category/([^/]+)/([0-9]+)/?$ category.php/$1/$2/ [QSA,L]
RewriteRule ^category/([^/]+)/?$ category.php/$1/ [QSA,L]
RewriteRule ^post/([^/]+)/?$ read.php/$1/ [QSA,L]
RewriteRule ^tag/([^/]+)/([0-9]+)/?$ tag.php/$1/$2/ [QSA,L]
RewriteRule ^tag/([^/]+)/?$ tag.php/$1/ [QSA,L]
RewriteRule ^page/([^/]+)/?$ page.php/$1/ [QSA,L]

如果未开启伪静态,请使用下面的内容:

RewriteEngine on
RewriteBase /
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

以上。

分类

最新文章

最近回复

  • 青山: 某种原因,暂停友链,抱歉。
  • 青山: 计划搬迁到腾讯云,正...
  • 老徐: 具体要哪个呢?
  • 老徐: 是不是有点老?
  • 青山: 哇,林志炫
  • 老白: 哇,这改的可以,能不...
  • 老徐: 23333
  • 许建华: 我是为了表情包来的~
  • vultr vps: 感谢分享深入学习
  • 青山: 每一次都是不同的感受

归档

标签云

C# .net core asp.net 情感 SQL mongodb sql server EasyUI 安全 激活 linux 身份验证 https typecho .net sql注入 kms MVC IIS 高并发 IE 坑爹 服务器 mysql Oracle Combobox Datagrid 口语 数据抓取

其它