我一直在努力使用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记录更少。
谢谢!