当前位置:  开发笔记 > 编程语言 > 正文

使用SSL和SslStream进行对等身份验证?

如何解决《使用SSL和SslStream进行对等身份验证?》经验,为你挑选了1个好方法。

我需要在使用TCP/IP套接字进行通信的各种进程之间提供安全通信.我想要身份验证和加密.我不想重新发明轮子,而是真的想使用SSL和SslStream类以及自签名证书.我想要做的是根据本地应用程序中的已知副本验证远程进程的证书.(不需要是证书颁发机构,因为我打算手动复制证书).

为此,我希望应用程序能够在第一次运行时自动生成新的证书.除了makecert.exe之外,看起来此链接显示了一种自动生成自签名证书的方法,因此这是一个开始.

我查看了SslStream的AuthenticateAsServer和AuthenticateAsClient方法.您可以提供回电验证,因此看起来可能.但是现在我已经了解了它的细节,我真的不认为这样做是可能的.

我正朝着正确的方向前进吗?还有更好的选择吗?有没有人之前做过这样的事情(基本上是点对点SSL而不是客户端服务器)?



1> Scott Whitlo..:

第1步:生成自签名证书:

我下载了Doug Cook发布的Certificate.cs课程

我使用此代码生成.pfx证书文件:

byte[] c = Certificate.CreateSelfSignCertificatePfx(
        "CN=yourhostname.com", //host name
        DateTime.Parse("2000-01-01"), //not valid before
        DateTime.Parse("2010-01-01"), //not valid after
        "mypassword"); //password to encrypt key file

    using (BinaryWriter binWriter = new BinaryWriter(
        File.Open(@"testcert.pfx", FileMode.Create)))
    {
        binWriter.Write(c);
    }

第2步:加载证书

    X509Certificate cert = new X509Certificate2(
                            @"testcert.pfx", 
                            "mypassword");

第3步:把它放在一起

我基于这个非常简单的SslStream示例

您将收到有关SslProtocolType枚举的编译时错误.只需将其从SslProtocolType.Default更改为SslProtocols.Default即可

关于已弃用的功能有3个警告.我用建议的替换品替换了它们.

我使用步骤2中的行替换了Server Program.cs文件中的这一行:

X509Certificate cert = getServerCert();

在Client Program.cs文件中,确保设置serverName = yourhostname.com(并且它与证书中的名称匹配)

在Client Program.cs中,CertificateValidationCallback函数失败,因为sslPolicyErrors包含RemoteCertificateChainErrors.如果深入挖掘,这是因为签署证书的颁发机构不是受信任的根.

我不想让用户将证书导入根存储等,所以我为此做了一个特例,我检查了certificate.GetPublicKeyString()等于我在文件中的公钥对于那台服务器.如果匹配,我从该函数返回True.这似乎有效.

第4步:客户端身份验证

这是我的客户端验证的方式(它与服务器有点不同):

TcpClient client = new TcpClient();
client.Connect(hostName, port);

SslStream sslStream = new SslStream(client.GetStream(), false,
    new RemoteCertificateValidationCallback(CertificateValidationCallback),
    new LocalCertificateSelectionCallback(CertificateSelectionCallback));

bool authenticationPassed = true;
try
{
    string serverName = System.Environment.MachineName;

    X509Certificate cert = GetServerCert(SERVER_CERT_FILENAME, SERVER_CERT_PASSWORD);
    X509CertificateCollection certs = new X509CertificateCollection();
    certs.Add(cert);

    sslStream.AuthenticateAsClient(
        serverName,
        certs,
        SslProtocols.Default,
        false); // check cert revokation
}
catch (AuthenticationException)
{
    authenticationPassed = false;
}
if (authenticationPassed)
{
    //do stuff
}

CertificateValidationCallback与服务器案例中的相同,但请注意AuthenticateAsClient如何获取证书集合,而不仅仅是一个证书.所以,你必须添加一个LocalCertificateSelectionCallback,就像这样(在这种情况下,我只有一个客户端证书,所以我只返回集合中的第一个):

static X509Certificate CertificateSelectionCallback(object sender,
    string targetHost,
    X509CertificateCollection localCertificates,
    X509Certificate remoteCertificate,
    string[] acceptableIssuers)
{
    return localCertificates[0];
}


也许就是这样:http://leastprivilege.com/2005/02/28/sslstream-sample/
推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有