2012-04-13 3 views
3

로그인 URL의 일부가 인증을 요구하는 서버로 작업하고 있습니다. 이 계획은 (매뉴얼에서 권장) 작동 방법은openssl을 사용하여 Java 서명 서명 방법을 에뮬레이트하는 방법은 무엇입니까?

  • 공개/개인 키 쌍 인증서가 생성됩니다
  • (자바 키 저장소를 생성) 자바 JDK 키 도구를 사용하여 생성되는 것입니다 키 쌍을 사용하여 Java JDK keytool
  • 인증서가 서버에 설치됩니다.

클라이언트에서 로그인 (내 코드)

  • 는 일반 텍스트 토큰 문자열을
  • 징후
  • 서명 된 토큰 문자열을 포함하는 일반 텍스트 토큰 개인 키를 사용하여 SHA1와 문자열 DSA를 생성 로그인 URL에.

Java 키 도구는 키 저장소에서 개인 키를 내보낼 수있는 메커니즘을 제공하지 않지만, 별도 나는 키 저장소에서 개인 키를 추출하고 파일에 저장하는 자바 코드를 - How do I list/export private keys from a keystore?에 따라.

이 모든 것은 클라이언트가 Java를 사용하여 서명을 할 때 다음과 같은 코드로 작동합니다.

String plaintext = "This is a sample plaintext token string"; 
Signature instance = Signature.getInstance("SHA1withDSA"); 
instance.initSign(privateKey); 
instance.update((plaintext).getBytes()); 
byte[] signature = instance.sign(); 

클라이언트가 PHP를 사용하여 서명을 할 때도 다음과 같은 코드로 작동합니다. . 여기에 내가 지금 고객이 배쉬 스크립트 및하려면 openssl을 사용하여 로그인 URL을 구성하고자하는 상황이 그러나 개인 키는

$privateKey = openssl_pkey_get_private("file://$keyfile", $keystorePassword); 
openssl_sign($paramsEncoded, $signature, $privateKey, OPENSSL_ALGO_DSS1)) 

] PHP에서 Java 키 저장소 파일에서 검색 - 그것은 작동하지 않습니다. 해당 코드의 가장 최신 버전은 SHA1 메시지 요약과 DSA 서명을 수행하는 다음과 같습니다. 그러나 서버는 토큰을 거부합니다.

echo $tokenString | openssl dgst -sha1 > tokendigest 
openssl dgst -dss1 -passin pass:$storePassword -sign $privateKeyFile > tokensigned 

나는 자바 서명 서명 방법은 다이제스트에 서명 아니라 다이제스트 알고리즘 ID 및 다이제스트의 연결에 서명하지 않는 것을 제안이 게시물 ( Using SHA1 and RSA with java.security.Signature vs. MessageDigest and Cipher)을 가로 질러왔다. 게시물의 코드를 단계별로 실행 한 결과, SHA1의 경우 다이제스트 앞에 바이트가 48 33 48 9 6 5 43 14 3 2 26 5 0 4 20 접두어로 있어야합니다. 하지만 추가 한 후에도 opensll을 사용하여 서버에서 사용할 수있는 서명 된 토큰을 생성 할 수 없습니다.

누구든지 openssl을 사용하여 Java 서명 서명 방법을 에뮬레이트하는 방법을 알고 있습니까?

답변

2

다른 게시물은 빨간색 청어입니다. DSA는 RSA와 다르게 작동하며 MessageDigest-prefix를 사용하지 않습니다.

그러나 openssl dgst -dss1은 직접 작동해야합니다 (SHA1 소화 포함).

시도해 보셨습니까?

echo -n $tokenString | 
    openssl dgst -dss1 -passin pass:$storePassword -sign $privateKeyFile > tokensigned 
+0

"토큰 로그인에 오류가 발생했습니다"와 같은 결과가 나타났습니다. 나는 openssl 검증을 추가했다. (아래) - openssl은 Verified OK를보고했다. 'echo $ tokenString | openssl dgst -dss1 -passin pass : $ storePassword -sign $ privateKeyFile> $ signedTokenOpensslFile echo $ tokenString | openssl dgst -dss1 -verify $ publicKeyFile -signature $ signedTokenOpensslFile' – Torid

+0

@ Torid : 문제는 'echo'가 문자열에 추가하는 새 줄 바꿈 일 수 있습니다. 'echo -n'을 시도하십시오. –

+0

예. 'echo -n'은 그것을 고쳤습니다. 나는 그것이 나를 약간 바보 같이 느끼게 할 때조차도 stackoverflow.com을 좋아한다. 감사! – Torid

관련 문제