Các cửa sổ bật lên đã được kích hoạt từ các nhà cung cấp MS-CAPI Cryptographic Service Provider (CSP) - DLL được cung cấp bởi các nhà sản xuất thẻ USB - mà cuối cùng liên lạc với các dấu hiệu thông qua một trình điều khiển (cũng được cung cấp bởi các token-nhà sản xuất). KeyStore chỉ thực hiện một cuộc gọi và các lớp ở giữa chỉ truyền nó qua; firmware trên mã thông báo là một trong đó ném lên sự xác thực pop-up và duy trì phiên bang vv
Các dll chìa khóa Java là sunmscapi.dll trong đó có việc thực hiện:
// Use CertEnumCertificatesInStore to get the certificates
// from the open store. pCertContext must be reset to
// NULL to retrieve the first certificate in the store.
while (pCertContext = ::CertEnumCertificatesInStore(hCertStore, pCertContext))
{
// Check if private key available - client authentication certificate
// must have private key available.
HCRYPTPROV hCryptProv = NULL;
DWORD dwKeySpec = 0;
HCRYPTKEY hUserKey = NULL;
BOOL bCallerFreeProv = FALSE;
BOOL bHasNoPrivateKey = FALSE;
DWORD dwPublicKeyLength = 0;
if (::CryptAcquireCertificatePrivateKey(pCertContext, NULL, NULL,
&hCryptProv, &dwKeySpec, &bCallerFreeProv) == FALSE)
{
bHasNoPrivateKey = TRUE;
} else {
// Private key is available
BOOL bGetUserKey = ::CryptGetUserKey(hCryptProv, dwKeySpec, &hUserKey);
// Skip certificate if cannot find private key
if (bGetUserKey == FALSE)
{
if (bCallerFreeProv)
::CryptReleaseContext(hCryptProv, NULL);
continue;
}
....
Như bạn có thể thấy nó luôn kiểm tra khóa riêng. Bạn sẽ phải sửa đổi mã này và tạo ra một phiên bản tùy chỉnh của sunmscapi.dll để tránh điều này hoặc nếu không đánh bại kiểm tra này.
Nguồn
2012-10-31 19:56:12
Câu hỏi này không thu hút được nhiều sự chú ý, có thể hỏi tại diễn đàn của Oracle (liên kết tới câu hỏi này). –