Authentication is the process of determining whether or not a remote host can be trusted. To establish its trustworthiness, the remote host must provide an acceptable authentication certificate based on public-key cryptography. Windows CE supports X.509-style certificates.
Remote hosts establish their trustworthiness by obtaining a certificate from a Certificate Authority (CA). The CA may, in turn, have certification from a higher authority, and so on, creating a chain of trust. To determine whether a certificate is trustworthy, an application must determine the identity of the root CA, and then decide if it can be trusted.
Windows CE maintains a database of trusted CAs. When a secure connection is attempted by an application, Windows CE extracts the root certificate from the certification chain and checks it against the CA database. It delivers the root certificate to the application through a certificate validation callback function, along with the results of the comparison against the CA database.
Applications bear ultimate responsibility for deciding whether or not the certificate is acceptable. They are free to accept or reject any certificate, based on whatever criteria are appropriate. If the certificate is rejected, the connection is not completed. At a minimum, a certificate should meet the following two requirements: It should be current, and the identity contained within the certificate should match the identity of the root CA.
The certificate validation callback function must be implemented by all client applications that use secure sockets. The value it returns determines whether or not the connection will be completed by Winsock. It must have the following syntax:
int SslValidate (
DWORD dwType
LPVOID pvArg
DWORD dwChainLen
LPBLOB pCertChain
DWORD dwFlags
);
The parameters contain the following information:
The values returned by the callback function are described in the following table.
Return value | Description |
---|---|
SSL_ERR_BAD_DATA | The certificate is not properly formatted. |
SSL_ERR_BAD_SIG | The signature check failed. |
SSL_ERR_CERT_EXPIRED | The certificate has expired. |
SSL_ERR_CERT_REVOKED | The certificate has been revoked by its issuer. |
SSL_ERR_CERT_UNKNOWN | The issuer is unknown, or some unspecified problem arose in the processing of the certificate, rendering it unacceptable |
SSL_ERR_OKAY | The certificate is acceptable. |