【问题标题】:Creating an SSL socket on Windows that uses the WinCrypt certificates for authentication?在 Windows 上创建使用 WinCrypt 证书进行身份验证的 SSL 套接字?
【发布时间】:2012-04-14 08:05:11
【问题描述】:

在验证 SSL 客户端连接时,服务器希望客户端提供证书。在典型的企业 Windows 平台上,这些证书位于 Windows 加密存储的“个人”部分(使用以下命令打开:“certmgr.msc”)

OpenSSL 不使用这些证书。 Windows 确实提供了一个 WinHTTP API,它提供了创建 SSL 连接的能力,但它们必须遵守 HTTP 请求/响应协议,是否有人知道 Windows API 允许程序员创建一个 SSL 连接,该连接使用 Windows 加密存储证书进行身份验证,但是可以像 OpenSSL 套接字一样使用吗?谢谢。

【问题讨论】:

    标签: c++ c windows ssl x509


    【解决方案1】:

    Openssl 支持多种加密引擎,其中之一是 Windows CAPI 引擎。

    这是我机器上openssl engine 的结果。 CAPI 是最后一个:

    (dynamic) Dynamic engine loading support
    (4758cca) IBM 4758 CCA hardware engine support
    (aep) Aep hardware engine support
    (atalla) Atalla hardware engine support
    (cswift) CryptoSwift hardware engine support
    (chil) CHIL hardware engine support
    (nuron) Nuron hardware engine support
    (sureware) SureWare hardware engine support
    (ubsec) UBSEC hardware engine support
    (padlock) VIA PadLock (no-RNG, no-ACE)
    (gost) Reference implementation of GOST engine
    (capi) CryptoAPI ENGINE
    

    OpenSSL engine(3) man page 显示了有关如何在代码中选择引擎的示例代码。构建 OpenSSL 可能有点棘手。这是一个批处理文件,它将生成一个静态构建,其中所有引擎也静态链接。不是部署的最佳选择,但在处理 CAPI 详细信息时,只有一个文件可以让您从 DLL 地狱中解脱出来。

    @echo off
    setlocal
    
    call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
    
    ::Get the current directory name in the variable builddir
    for /f "delims=\" %%a in ("%cd%") do set builddir=%%~nxa
    
    ::Configure build variable
    perl Configure VC-WIN32 enable-static-engine --prefix=.
    
    ::Generate makefile
    call ms\do_nasm.bat
    
    ::Build
    nmake -f ms\nt.mak
    ::Test
    nmake -f ms\nt.mak test
    ::Install
    nmake -f ms\nt.mak install
    
    endlocal
    

    【讨论】:

      【解决方案2】:

      Doh!,原来WinSock 原生支持 SSL,大概它与 Windows 证书存储完美集成。

      编辑:不幸的是,这仅适用于 Windows Mobile

      正如 Luke 在下面的 cmets 中指出的那样,正确的方法是使用 SChannel API。这个讨厌的 API 将在here 进行更详细的讨论。

      【讨论】:

      • 这仅适用于 Windows 的移动版本。如果您的目标是台式机或服务器,那就有点麻烦了。
      • 这是一个巨大的痛苦。你必须在你的普通套接字逻辑之间插入大量的安全 API 调用,并且有很多缓冲区操作和管理;这是荒谬的乏味和难以做到的。如果可能的话,您应该使用第 3 方解决方案来处理繁重的工作。我自己这样做是为了“好玩”(我一定是个受虐狂),发现this page 非常有用。顶部有一个代码链接,可以很好地封装您通常需要的功能(连接/断开与主机的连接、发送/接收数据等)。
      • 感谢您提供的信息,如果您对此效果做出充实的回答,我会接受。
      猜你喜欢
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 2017-06-08
      • 2023-03-29
      • 2012-10-14
      • 2013-08-04
      • 2021-02-11
      • 2012-09-12
      相关资源
      最近更新 更多