最近项目出了一个问题,服务器端的SSL的证书更换了。加密key的长度用1024位升级到2048位。结果出问题了。客户端末通信是全都连不上服务器了。
于是就解决呗,解决的途中却让我更加的摸不到头脑了。
当初在做webService声明的时候,就是通过VS2005的WEB引用,自动生成webservice。
但是做的时候,用的自己的机器,svr.url = http://XXX.XXX.XXX.XXX/webservice.aspx,
而在部署的时候把这个svr.url改成了svr.url=https://www.XXXXXX.com/webservice.aspx
经过测试,无论是模拟器还是手机均顺利通过,就没有考虑http和https会带来多少不同。
出了问题后开始考虑为什么证书更换后,https就连接不上服务器了呢?
查找资料找到 http://msdn.microsoft.com/en-us/library/bb738067.aspx
该资料上说,适用的平台是
Windows Mobile 6 Professional
Windows Mobile 6 Standard
Windows Mobile 6 Classic
Microsoft Visual Studio® .NET 2005
Microsoft .NET Compact Framework version 2.0
对我完全适合,太好了
一大篇废话后,终于看到 SSL with the .NET Compact Framework这个要点了
看到里面说了一句话:
However, in a .NET Compact Framework application you will not automatically get this option to confirm the use of a certificate with a problem.
心里一阵阵的深寒啊,上面说 .net Compact Framework application不能自动得到证书。
额滴神啊。。。。。。。我们以前的source是怎么样验证了证书后连接到HTTPS的呢??
这个问题一直都没有找到原因。后来我才想应该是在做web参照引用声明webservice的时候,.net Compact Framework做了什么事情,但是具体什么什么事情,我就不知道了。
但明显和我看到的那篇文章所说的现象是不符的。
这个文字在CSDN上提了问题http://topic.csdn.net/u/20100621/08/771fa62d-4f30-4ad8-acde-1be5486a9585.html 但是至今没有得到合适的回答。
好了,先假装出问题之前能取得链接和我没有半毛钱关系(自己寒自己一个!咱咋就这么没有钻研精神捏??)
不管怎么样,先让客户连接上吧,怎么处理呢?
还是那篇文章中,提到一个人在blog中提到解决方法,(不知道微软官方是否赞同这种做法,为什么还要引用别人的博客来说明解决方案啊)
此人重新实现了ICertificatePolicy接口,这个接口就是做证书认证的。
C#代码
public class TrustAllCertificatePolicy : ICertificatePolicy
{
public TrustAllCertificatePolicy()
{
}
public bool CheckValidationResult(ServicePoint sp,
X509Certificate cert, WebRequest req, int problem)
{
return true;
}
}
Vb代码
Public Class TrustAllCertificatePolicy Implements System.Net.ICertificatePolicy
Public Sub New()
End Sub
Public Function CheckValidationResult(ByVal sp As ServicePoint, _
ByVal cert As System.Security.Cryptography.X509Certificates.X509Certificate, _
ByVal req As WebRequest, _
ByVal problem As Integer) As Boolean Implements ICertificatePolicy.CheckValidationResult
Return True
End Function
End Class
之后,在webservice调用之前,用这个TrustAllCertificatePolicy 类来接管证书认证处理。
<SPAN style="FONT-SIZE: small">system.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();</SPAN>
system.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy()
这样就避开了证书不对的问题,无视证书是否存在或者正确,都能通过证书验证,之后进行https的加密传输了。
OK,连接上了吧。
我的问题又来了,证书都没有,https是如何进行加密的,这个通信连接到底有没有加密?如果不加密的话那用https干嘛?
客户的数据是不是安全不说了,向verisign申请SSL证书的钱不是打水漂了?(有点本末倒置了,嘎嘎)
是要解决Https的验证问题,也同样需要保证链接是加密的对吧。
那么https是通过怎么样流程达到了加密的目的呢?
有问题问google,没有问题创造问题也要问google。(怎么一点都不低碳啊!要创建和&谐社会不是?)
HTTPS怎么链接,咱去调查一下。