Microsoft RPC SChannel未加密

时间:2017-04-18 15:37:25

标签: c winapi rpc schannel

我一直在努力使用Microsoft RPC获得安全的RPC客户端/服务器。我没有使用COM,只是直接使用C.

我已创建了根CA证书,并为该服务器创建了此证书签名的证书。证书安装在证书库中。

RPC工作正常,未经加密,甚至可以使用SCHANNEL设置,只是没有加密。

ServerCode:

RpcServerUseProtseqEpW(
    L"ncacn_ip_tcp", 
    RPC_C_LISTEN_MAX_CALLS_DEFAULT, 
    port, 
    NULL);

CertOpenStore(
    CERT_STORE_PROV_SYSTEM,
    0,
    (HCRYPTPROV)NULL,
    CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_READONLY_FLAG,
    L"MY")

CertFindCertificateInStore(
    hStore,
    X509_ASN_ENCODING|PKCS_7_ASAN_ENCODING,
    CERT_FIND_SUBJEECT_STR,
    subject,
    NULL);

RpcCertGeneratePrincipalNameW(
    ccert_ctx_server, 
    RPC_C_FULL_CERT_CHAIN,
    serverPrincName);

schannel.dwVersion = SCHANNEL_CRED_VERSION;
schannel.cCreds = 1;
schannel.paCred = &ccert_ctx_server;

RpcServerRegisterAuthInfoW(
    serverPrincName,
    RPC_C_AUTHN_GSS_SCHANNEL,
    NULL,
    &schannel);

RpcServerRegisterIf2(
    h_v1_ifspec,
    NULL,
    NULL,
    RPC_IF_ALLOW_CALLBACKS_WITH_NO_AUTH  // seems to be required by SCHANNEL
    RPC_C_LISTEN_MAX_CALLS_DEFAULT,
    (unsigned)-1,
    SecurityCallback);  SecurityCallback returns RPC_S_OK

客户代码:

RpcStringBindingComposeW(
    NULL,
    L"ncacn_ip_tcp",
    address,
    port,
    NULL,
    &stringBinding);

RpcBindingFronStringBindingW(
    stringBinding,
    hBind);

CertOpenStore(
    CERT_STORE_PROV_SYSTEM,
    0,
    (HCRYPTPROV)NULL,
    CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_READONLY_FLAG,
    L"MY")

CertFindCertificateInStore(
    hStore,
    X509_ASN_ENCODING|PKCS_7_ASAN_ENCODING,
    CERT_FIND_SUBJEECT_STR,
    subject,
    NULL);

RpcCertGeneratePrincipalNameW(
    ccert_ctx_server, 
    RPC_C_FULL_CERT_CHAIN,
    serverPrincName);

schannel.dwVersion = SCHANNEL_CRED_VERSION;
schannel.cCreds = 1;
schannel.paCred = &ccert_ctx_client;

RpcServerRegisterAuthInfoW(
    serverPrincName,
    RPC_C_AUTHN_GSS_SCHANNEL,
    NULL,
    &schannel);

RpcBindingSetAuthInfo(
    hBind,
    serverPrincName,
    RPC_C_AUTHN_LEVEL_PKT_INTEGRITY,
    RPC_C_AUTHN_GSS_SCHANNEL,
    &schannelCred,
    RPC_C_AUTHZ_NONE)

鉴于所有这些RPC都可以工作,但它不会像wireshark一样经过验证加密。我使用非常小的SCHANNEL结构定义并且不使用qos结构。没有什么比这更大的了。唯一真正有所作为的是我将RPC_IF_ALLOW_CALLBACKS_WITH_NO_AUTH更改为RPC_IF_ALLOW_SECURE_ONLY。然后我在进行RPC调用时获得访问被拒绝。根据我的理解,这是SCHANNEL的正常功能,您必须在安全回调中提供自己的身份验证。

当我在安全回调中调用RpcBindingInqAuthClient时,我收到错误1746:绑定不包含任何认证信息。

我查看了MSDN,这是网上散布的几个不同的链接,但是很少有人知道让SCHANNEL工作的帮助。

我对SCHANNEL的选择是我不能依赖kerberos或ntlm。我正在通过互联网运行tcp,所以证书对我有用。我不能使用http,因为我无法在我的服务器上设置IIS,DCE似乎比schannel记录更少。

谢谢!

0 个答案:

没有答案