Java 웹 서비스 클라이언트를 개발하는 동안 문제가 발생했습니다. 웹 서비스 인증은 클라이언트 인증서, 사용자 이름 및 비밀번호를 사용합니다. 웹 서비스 뒤에있는 회사에서받은 클라이언트 인증서의 .cer
형식 이 다릅니다 . 텍스트 편집기를 사용하여 파일을 검사하면 다음 내용이 있습니다.
-----BEGIN CERTIFICATE-----
[Some base64 encoded data]
-----END CERTIFICATE-----
Internet Explorer에서이 파일을 인증서로 가져 와서 (암호를 입력하지 않아도 됨) 웹 서비스에서 인증하는 데 사용할 수 있습니다.
먼저 첫 번째 줄과 마지막 줄을 제거하고 유닉스 개행으로 변환하고 base64 디코딩을 실행하여이 인증서를 키 저장소로 가져올 수있었습니다. 결과 파일을 keytool
명령을 사용하여 키 저장소로 가져올 수 있습니다 . 키 저장소에 항목을 나열하면이 항목은 유형 trustedCertEntry
입니다. 이 항목 유형 (?)으로 인해이 인증서를 사용하여 웹 서비스를 인증 할 수 없습니다. 제공된 인증서가 인증에 사용되는 공용 인증서라고 생각하기 시작했습니다 …
내가 찾은 해결 방법은 IE에서 인증서를 가져 와서 .pfx
파일 로 내보내는 것 입니다. 이 파일은 키 저장소로로드 될 수 있으며 웹 서비스를 인증하는 데 사용될 수 있습니다. 그러나 고객이 새 인증서를받을 때마다 이러한 단계를 수행 할 것으로 기대할 수 없습니다. 그래서 .cer
파일을 Java로 직접 로드하고 싶습니다 . 이견있는 사람?
추가 정보 : 웹 서비스 뒤에있는 회사는 나중에 인증서를 가져올 PC 및 사용자에게 인증서를 요청해야한다고 IE와 웹 사이트를 사용하여 알려줍니다.
답변
- 인증하려면 개인 키가 필요합니다. 다른 옵션은 없습니다.
- 인증서는 추가 속성 (예 : 회사 이름, 국가 등)이있는 공개 키로, 첨부 된 속성이 사실임을 보증하는 일부 인증 기관에서 서명합니다.
.CER
파일은 인증서이며 개인 키가 없습니다. 개인 키는.PFX keystore
일반적으로 파일 됩니다. 실제로 인증 한 경우 개인 키를 이미 가져 왔기 때문입니다.-
일반적으로
.CER
문제없이 인증서를 가져올 수 있습니다keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias"
답변
.cer
브라우저에서 다운로드 한 인증서 파일 (url을 열고 세부 정보를 보려면 dig)을 cacerts 키 저장소 로 가져 오면 java_home\jre\lib\security
내 키 저장소를 생성하여 사용하려는 것과는 대조적으로 제게 도움이되었습니다.
- 당신의
java_home\jre\lib\security
- ( Windows )
cmd
및 CTRL+를 사용하여 관리자 명령 줄을 엽니 다.SHIFT +를ENTER - keytool을 실행하여 인증서를 가져 오십시오.
- (대체
yourAliasName
하고path\to\certificate.cer
각각)
- (대체
..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer
이 방법으로 추가 JVM 옵션을 지정할 필요가 없으며 JRE에서 인증서를 인식해야합니다.
답변
다음은 프로그래밍 방식으로 .cer 파일을 새 KeyStore로 가져 오는 데 사용했던 코드입니다.
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
//VERY IMPORTANT. SOME OF THESE EXIST IN MORE THAN ONE PACKAGE!
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
//Put everything after here in your function.
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);//Make an empty store
InputStream fis = /* insert your file path here */;
BufferedInputStream bis = new BufferedInputStream(fis);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
while (bis.available() > 0) {
Certificate cert = cf.generateCertificate(bis);
trustStore.setCertificateEntry("fiddler"+bis.available(), cert);
}
답변
인증서를 변경할 필요가 없습니다. 올바른 가져 오기 명령을 실행하고 있습니까?
다음은 나를 위해 작동합니다.
keytool -import -alias joe -file mycert.cer -keystore mycerts -storepass changeit
mycert.cer에는 다음이 포함됩니다.
-----BEGIN CERTIFICATE-----
MIIFUTCCBDmgAwIBAgIHK4FgDiVqczANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
...
RLJKd+SjxhLMD2pznKxC/Ztkkcoxaw9u0zVPOPrUtsE/X68Vmv6AEHJ+lWnUaWlf
zLpfMEvelFPYH4NT9mV5wuQ1Pgurf/ydBhPizc0uOCvd6UddJS5rPfVWnuFkgQOk
WmD+yvuojwsL38LPbtrC8SZgPKT3grnLwKu18nm3UN2isuciKPF2spNEFnmCUWDc
MMicbud3twMSO6Zbm3lx6CToNFzP
-----END CERTIFICATE-----
답변
keystore-explorer.org 에서 오픈 소스 GUI 도구를 사용할 수 있습니다.
키 스토어 탐색기
KeyStore Explorer는 Java 명령 행 유틸리티 keytool 및 jarsigner를 대체하는 오픈 소스 GUI입니다. KeyStore Explorer는 직관적 인 그래픽 사용자 인터페이스를 통해 기능 등을 제공합니다.
다음 화면이 도움이 될 것입니다 (공식 사이트에서 제공)
명령을 실행하여 얻는 기본 화면 :
shantha@shantha:~$./Downloads/kse-521/kse.sh
Examine
및 Examine a URL
옵션으로 이동 한 다음 가져올 웹 URL을 제공하십시오.
Google 사이트 링크를 제공하면 결과 창은 아래와 같습니다.
이것은 유스 케이스 중 하나이며 나머지는 사용자에게 달려 있습니다 (모든 크레딧은 keystore-explorer.org 로 이동하십시오 )
답변
이미 가지고있는 인증서는 아마도 서버의 인증서이거나 서버의 인증서에 서명하는 데 사용 된 인증서 일 것입니다. 웹 서비스 클라이언트가 서버를 인증 할 수 있도록해야합니다.
그러나 SSL을 사용하여 클라이언트 인증을 추가로 수행해야하는 경우 웹 서비스 클라이언트를 인증하려면 자체 인증서를 가져와야합니다. 이를 위해 인증서 요청을 작성해야합니다. 이 과정에는 자체 개인 키와 해당 공개 키를 생성하고 해당 공개 키와 일부 정보 (이메일, 이름, 도메인 이름 등)를 인증서 요청이라는 파일에 첨부하는 과정이 포함됩니다. 그런 다음 해당 인증서 요청을 이미 요청한 회사에 보내면 개인 키로 공개 키에 서명하여 인증서를 만들고 인증서와 함께 X509 파일을 다시 보내줍니다. 이제 키 저장소에 추가하면 클라이언트 인증이 필요한 SSL을 사용하여 웹 서비스에 연결할 수 있습니다.
인증서 요청을 생성하려면 “keytool -certreq -alias -file -keypass -keystore”를 사용하십시오. 결과 파일을 서명 할 회사로 보냅니다.
인증서를 받으면 “keytool -importcert -alias -keypass -keystore”를 실행하십시오.
키 스토어가 보호되어있는 경우 두 가지 경우 모두 -storepass를 사용해야합니다 (좋은 아이디어).
답변
다음은 현재 디렉토리의 많은 crt 파일을 Java 키 저장소로 일괄 가져 오기하는 데 사용한 스크립트입니다. 이것을 인증서와 같은 폴더에 저장하고 다음과 같이 실행하십시오.
./import_all_certs.sh
import_all_certs.sh
KEYSTORE="$(/usr/libexec/java_home)/jre/lib/security/cacerts";
function running_as_root()
{
if [ "$EUID" -ne 0 ]
then echo "NO"
exit
fi
echo "YES"
}
function import_certs_to_java_keystore
{
for crt in *.crt; do
echo prepping $crt
keytool -import -file $crt -storepass changeit -noprompt --alias alias__${crt} -keystore $KEYSTORE
echo
done
}
if [ "$(running_as_root)" == "YES" ]
then
import_certs_to_java_keystore
else
echo "This script needs to be run as root!"
fi