博客 (152)

首先要有个工行U盾,一台手机。

苹果用户在 App Store 中搜索 中国工商银行 和 工商银行通用U盾

安卓用户从 m.icbc.com.cn 网站下载安装客户端。


image.png  image.png


以 iPhone 为例:


打开工行U盾 App,选择U盾厂商(我的是“天地融”,无法确定的可以在此查询

把U盾插入手机的耳机孔,状态显示“已连接”

此时点击“查看证书”提示未安装证书


打开中国工商银行 App,进入:我的 - 安全中心 - 支付管理 - 安全介质管理 - U盾证书下载

依照提示安装证书

现在可以愉快地大额转账啦!


xoyozo 8 年前
18,084

“/”应用程序中的服务器错误。


指定的参数已超出有效值的范围。
参数名: site

说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

异常详细信息: System.ArgumentOutOfRangeException: 指定的参数已超出有效值的范围。
参数名: site

解决方法:安装 IIS

xoyozo 8 年前
7,250

在 IIS 中编辑网站绑定时,提示“至少一个其他网站正在使用同一 HTTPS 绑定,而此绑定用另一个证书配置。确实要重用此 HTTPS 绑定并将其他网站重新指定为使用新证书吗?”,那么所有网站都必须使用同一个域名证书吗?

否。只要在绑定 https 域名的时候勾选“需要服务器名称指示”就行了。


使用证书链检测工具检测结果证书链(Certificate chain)不完整怎么办?

这个问题我在两台相同版本 CentOS 和相同版本宝塔面板的 Linux 服务器上遇到过,一台证书链完整,一台证书链不完整。

使用宝塔自带的 SSL 证书导入的方式可能出现这种情况(个例),关闭之,并手动配置 nginx 的 conf 文件;而再有一台,手动配置不生效,宝塔自带 SSL 成功,因此请自行尝试。

我也在两台相同版本的 Windows Server 2012 R2 上(IIS 8.5)遇到过,一台证书链完整,一台证书链不完整。

解决思路:在命令提示符中键入 mmc,打开:文件 - 添加/添加管理单元,选择“证书”添加,选择“计算机帐户”,确定。展开“证书”

在“个人 - 证书”中可以看到我们导入的域名证书,查看它的颁发者,确保在“中间证书颁发机构 - 证书”(或“受信任的根证书颁发机构”)中能够找到,找到后继续找该证书的颁发者,一直找到根证书。一般会有多个中间证书,形成一个完整的证书链,如果证书有缺失,那么尝试重新导入域名证书,或向供应商索要中间证书。

有任何改动后,在命令提示符中执行 iisreset 来重启 IIS(IIS 管理器中的“重新启动”可能重启得不彻底),并且找到网站 - 绑定 - 删除 https 类型的绑定并重新添加,以使证书生效。

检测证书链完整后,继续摸索过程中发现,删除某中间证书,然后在 IIS 中重新绑定,会自动生成中间证书,难道是域名证书中已经包含了中间证书和根证书等完整的证书链,还是 Windows 会自动下载安装这些证书呢?


在开发支付宝支付/微信支付时回调 Url 无法接收数据。

可能是证书链不完整,建议用工具检测:GeoCerts™ SSL Checker,并用上述方法补全。


>> 遇到新问题将不断补充本文 <<

xoyozo 8 年前
8,089
  1. 下载 Senparc 官方 Sample


  2. 打开:\WeiXinMPSDK-master\src\Senparc.Weixin.MP.Sample\Senparc.Weixin.MP.Sample.sln


  3. 工具 - NuGet 包管理器 - 管理解决方案的 NuGet 程序包 - 更新

    选择所有的包(Microsoft.Net.Http 无法更新,暂不勾选),更新

    Microsoft.Net.Http 是个老顽固,无法更新也无法卸载,原因是它的语言包 Microsoft.Net.Http.zh-Hans 无法安装。我们切换到“已安装”选项卡,搜索“Microsoft.Net.Http”,选中 Microsoft.Net.Http.zh-Hans 并卸载它,现在我们可以更新 Microsoft.Net.Http 了。


  4. 【可能】运行报错:

    “/”应用程序中的服务器错误。

    配置错误

    说明: 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。 

    分析器错误消息: 创建 system.web.webPages.razor/host 的配置节处理程序时出错: 未能加载文件或程序集“System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)

    源错误: 

    行 4:    <configSections>
    行 5:      <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    行 6:        <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    行 7:        <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    行 8:      </sectionGroup>


    源文件: E:\WeiXinMPSDK-master\src\Senparc.Weixin.MP.Sample\Senparc.Weixin.MP.Sample\views\web.config    行: 


    展开 Senparc.Weixin.MP.Sample 引用,查看 System.Web.Razor 的属性,复制版本号。打开 \views\web.config,修改 System.Web.WebPages.Razor 的 Version(有 3 处)。


  5. 对于小型开发项目来说,我习惯将所有代码放在同一个项目(Project)中来,所以做了以下处理:(盛派官方分离这些代码是为了同时供 MVC 和 WebForms 重用)

    在 Senparc.Weixin.MP.Sample 中添加文件夹 CommonService,将 Senparc.Weixin.MP.Sample.CommonService 项目中的文件夹和文件(.config 除外)拖到 CommonService 文件夹中。

    卸载 Senparc.Weixin.MP.Sample.CommonService 项目并删除引用。


  6. 在解决方案的 Libraries 文件夹中,我们看到 Sample 项目了以下功能模块,这些就是 Senparc.Weixin 的源代码,如果不需要修改,可以卸载它们改为使用从 NuGet 获取,以便随时更新到最新版本:

    Senparc.WebSocket

    Senparc.Weixin

    Senparc.Weixin.MP

    Senparc.Weixin.MP.MvcExtension NuGet 中对应的包名为:Senparc.Weixin.MP.MVC

    Senparc.Weixin.Open

    Senparc.Weixin.Work

    Senparc.Weixin.WxOpen

    Senparc.Weixin.Cache.Memcached

    Senparc.Weixin.Cache.Redis

    卸载这些项目,并在 NuGet 中安装这些模块(搜索“Senparc.Weixin”第一页都在了,认准作者 Jeffrey Su)

    单元测试项目中的引用也按需更换,当然也可以卸载这些单元测试项目(视情况保留 Senparc.Weixin.MP.Sample.Tests) 。


  7. 【可能】运行报错


    HTTP Error 500.19 - Internal Server Error

    无法访问请求的页面,因为该页的相关配置数据无效。

    配置源:

    134:     </sessionState>

    135:   <sessionState customProvider="Memcached" mode="Custom">

    136: <providers>


    可以在 Global.asax 的 RegisterWeixinCache() 中修改 Memcached 配置。

    或者打开 Web.config,找到 Memcached 所在的 sessionState 标签,注释掉,这样程序自动使用上方的 InProc(应用进程内)。

    如果开启了 ASP.NET State Service 服务,那么建议改用 StateServer,与 Custom 一样需要序列化,方便日后改用 Memcached 或 Redis。


  8. 再次更新 NuGet,否则会提示无法加载 Enyim.Caching 的错误(报错行:MemcachedObjectCacheStrategy.RegisterServerList(memcachedConfig);)。


  9. 接下来,进入微信公众平台,在左侧 开发 - 基本配置 中设置相关参数(填写“服务器地址(URL)”如“https://weixin.xoyozo.net/weixin/”),打开 Sample 项目中的 Web.config,配置我们的公众号参数。


  10. 将项目发布到服务器上,尝试向公众号发送消息吧。


  11. 单元测试

    设置单元测试中的公众号配置项:打开 Senparc.Weixin.MP.Test/CommonAPIs/CommonApiTest.cs,在 AppConfig 方法中可以看到支持两种配置方式,在 Senparc.Weixin.MP.Test/Config/test.config 配置文件中配置,或直接在 CommonApiTest.cs 文件中配置,前者格式如下,后者建议只在个人测试项目中使用。

    <Config>
      <AppId>YourAppId</AppId>
      <Secret>YourSecret</Secret>
      <MchId>YourMchId</MchId>
      <TenPayKey>YourTenPayKey</TenPayKey>
      <TenPayCertPath>YourTenPayCertPath</TenPayCertPath>
      <!-- 小程序 -->
      <WxOpenAppId>YourOpenAppId</WxOpenAppId>
      <WxOpenSecret>YourWxOpenSecret</WxOpenSecret>
    </Config>

    另外,将 _testOpenId 值改为自己的微信号在本公众号上的 openid。


  12. 微信网页授权(OAuth2)

    打开 OAuth2Controller 控制器,将“Index”Action 中的盛派的网址(有 2 处)改成:

    Request.Url.Scheme + "://" + Request.Url.Authority + "/Oauth2/……


  13. 未完待续……

xoyozo 8 年前
7,879

上一篇介绍了如何创建用于 https 的 SSL 证书,本文讲述如何将创建好的 SSL 证书配置到 nginx 中。

 

导入证书

将 .key 文件和 .crt 文件上传到服务器,位置如:/etc/ssl/

 

配置 .conf

打开网站配置文件 *.conf,一般在 /usr/local/nginx/conf/vhost/

添加监听 443 端口:

listen 443 ssl;

添加 ssl 配置信息:

ssl_certificate /etc/ssl/yourdomain.com.crt;
ssl_certificate_key /etc/ssl/yourdomain.com.key;
ssl_prefer_server_ciphers on;

yourdomain.com.crt 和 yourdomain.com.key 改成真实的文件名

 

实现 http 自动跳转 https

配置非 443 端口请求跳转 443 端口访问:

if ($server_port !~ 443)
{
    rewrite ^(/.*)$ https://$host$1 permanent;
}

如果要求仅将 GET/HEAD 请求自动跳转(POST 请求自动跳转会丢失表单数据),那么改成:

set $redirect_https 0;
if ($server_port !~ 443)
{
    set $redirect_https 1;
}
if ($request_method ~ ^(GET|HEAD)$)
{
    set $redirect_https "${redirect_https}2";
}
if ($redirect_https = 12)
{
    rewrite ^(/.*)$ https://$host$1 permanent;
}


验证

最后来检查一下配置得对不对:https://www.geocerts.com/ssl_checker


扩展阅读

在 IIS 中部署 SSL

安装 SSL 证书遇到的一些问题

 


xoyozo 8 年前
6,454

安装过程就不介绍了,主要记一下被动模式和端口开放设置。


FileZilla Server 默认以 21 端口安装,阿里云的安全组配置“入方向”规则:

协议类型:自定义 TCP,端口范围:21/21,授权对象 0.0.0.0/0


如果要配置“被动模式”,那么在 FileZilla Server 菜单中选择“Edit”- Settings

切换到“Passive mode settings”,打勾“Use custom port range”,并填写端口范围,譬如 30000-40000,确定。


同样在阿里云安全组中配置“入方向”规则:

协议类型:自定义 TCP,端口范围:30000/40000,授权对象 0.0.0.0/0


这样就可以使用被动模式连接了。

如果无法连接,可尝试打开 Windows Server 2016 的“服务器管理器”,选择右上角“工具”-“高级安全 Windows 防火墙”-“入站规则”-“新建规则”,将上述端口设为允许连接。

xoyozo 8 年前
7,239

502.5.png

解决方法:安装最新的 .NET Core runtime 即可:https://www.microsoft.com/net/download/core#/runtime

(Windows Server 上选择 Windows Server Hosting (x64 & x86))

xoyozo 8 年前
5,825
  1. 在 NuGet 中安装 Microsoft.AspNetCore.Session 和 Newtonsoft.Json

  2. 打开 Startup.cs,在 ConfigureServices 方法中加入(视情况配置相关属性)

    services.AddSession(options =>
    {
        // 设置了一个较短的时间,方便测试
        options.IdleTimeout = TimeSpan.FromSeconds(10);
        options.CookieHttpOnly = true;
    });
  3. 在 Configure 方法中加入

    app.UseSession();
  4. 添加 Extensions 文件夹并添加类 SessionExtensions.cs

    using Microsoft.AspNetCore.Http;
    using Newtonsoft.Json;
    
    public static class SessionExtensions
    {
        public static void Set<T>(this ISession session, string key, T value)
        {
            session.SetString(key, JsonConvert.SerializeObject(value));
        }
    
        public static T Get<T>(this ISession session, string key)
        {
            var value = session.GetString(key);
            return value == null ? default(T) :
                                  JsonConvert.DeserializeObject<T>(value);
        }
    }
  5. 使用方法

    HttpContext.Session.Set("abc", 123);
    var v1 = HttpContext.Session.Get<int>("abc");
    HttpContext.Session.Remove("abc");
    var v2 = HttpContext.Session.Get<int>("abc");
    // v1 = 123, v2 = 0
xoyozo 8 年前
5,371

经测试,.NET Framework 4.8 的 Cache.Insert() 已恢复正常。

安装 .NET Framework 4.7 后,不管项目有没有升级到 .NET Framework 4.7,使用 Cache.Insert() 添加的自动过期的缓存都不会过期了,可以使用 Cache.Add() 来解决!

使用 Cache.Insert() 例:

HttpRuntime.Cache.Insert(key, value, null, DateTime.Now.AddSeconds(5), Cache.NoSlidingExpiration);

改为使用 Cache.Add():

HttpRuntime.Cache.Add(key, value, null, DateTime.Now.AddSeconds(5), Cache.NoSlidingExpiration, CacheItemPriority.Default, null);

如果 Cache 中已保存了具有相同 key 的项,则调用 Add 方法将不作任何更改。(Insert 方法则会覆盖该值)


完整测试代码:

public static DateTime DateTimeNow
{
    get
    {
        if (HttpRuntime.Cache["DateTimeNow"] == null)
        {
            HttpRuntime.Cache.Add("DateTimeNow", DateTime.Now, 
                null, DateTime.Now.AddSeconds(5), Cache.NoSlidingExpiration, 
                CacheItemPriority.Default, null);
        }
        return Convert.ToDateTime(HttpRuntime.Cache["DateTimeNow"]);
    }
}


在部分项目中(如 .NET Framework 4 项目中)发现上述改动仍不起作用,不会自动过期,那么可以采用以下方法:


方法一、可以记录将数据添加到 Cache 的时间,获取数据时判断该时间,超时则清除该 Cache 并重新赋值;

方法二、放弃缓存依赖,用定时器清除 Cache 数据。

xoyozo 9 年前
6,208

如果在 Visual Studio 2017 中打开 LINQ To SQL  的 .dbml 文件时是以 XML 的方式打开的,那么需要安装“LINQ to SQL tools”,步骤如下:

1,关闭 VS

2,运行 VS 安装程序

3,修改

      image.png

4,切换到“单个组件”选项卡,勾选“LING to SQL 工具”

      image.png

5,确认修改

xoyozo 9 年前
11,500