2012-07-17 34 views
5

Tôi đang cố ký kỹ thuật số XML trong Perl bằng cách sử dụng mô-đun Crypt::OpenSSL::RSA. Tôi đang tải khóa cá nhân từ một tệp. Khóa riêng được tạo từ kho khóa bằng Java.Chữ ký số XML trong Perl

Dưới đây là mã của tôi Perl:

my $private = 'my_priv.key'; 
my $private_key = read_file($private); 
print "my private key text is\n", $private_key; 

Output, không đặt toàn bộ chủ chốt ở đây, chỉ cần vài dòng đầu tiên :-)

> -----BEGIN PRIVATE KEY----- MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKAuqJ1ZkxHZStfSt0CdEsaSYuLO 
> 6zDiTpt60asVLWpLe2bf... 


my $rsa_priv = Crypt::OpenSSL::RSA->new_private_key($private_key); 
print "my private key is\n",$rsa_priv->get_private_key_string(); 

Output :

> -----BEGIN RSA PRIVATE KEY----- 
> MIICXAIBAAKBgQCgLqidWZMR2UrX0rdAnRLGkmLizusw4k6betGrFS1qS3tm3+97 
> wMvFXCx0Od8eb 

Kết quả của $private_key$rsa_priv->get_private_key_string() là khác nhau. Nó có phải cư xử như thế không?

Có ai có thể ký XML bằng cách sử dụng Crypt::OpenSSL::RSA không?

chỉnh sửa:

Tôi đang sử dụng mã java để trích xuất các khóa bí mật, mã như sau 'KeyStore ks = KeyStore.getInstance ("JKS");

keypass = sPass.toCharArray(); 

FileInputStream fis = new FileInputStream(store); 
ks.load(fis, sPass.toCharArray()); 
fis.close(); 

String eol = System.getProperty("line.separator"); 

Key k = ks.getKey(alias, keypass); 

System.out.println("....Generating the Private Key....."); 
String encKey = new BASE64Encoder().encode(k.getEncoded()); 
System.out.println("Encoded Key: " + encKey); 
BufferedWriter myKey = null; 
myKey = new BufferedWriter(new FileWriter(alias + "_priv.key")); 
myKey.write("-----BEGIN PRIVATE KEY-----" + eol); 
myKey.write(encKey + eol); 
myKey.write("-----END PRIVATE KEY-----"); 
myKey.close(); 
System.out.println("....Private Key Generated.....");` 

sử dụng cả java và perl vì xml tôi đang cố đăng nhập nằm trong perl (đó là toàn bộ hệ thống lớn) và kho khóa nằm trong java.

Lần đầu kỹ thuật số ký bất cứ điều gì và xml chữ ký số của tôi không được chứng thực ở tất cả các hệ thống nhận

+0

Có lẽ nó có thể giúp đỡ nếu bạn thêm 'lệnh keytool' sử dụng để tạo ra khóa bí mật Java. –

+0

chỉ cần thêm mã được sử dụng để tạo khóa riêng – qateey

Trả lời

1

Kết quả $private_key;$rsa_priv->get_private_key_string(); là khác nhau, điều này có phải cư xử như thế?

Có, đầu vào là khóa X509, đầu ra là khóa RSA. openssl rsa -in my_priv.key cho kết quả tương tự.

Nếu bạn không có ý tưởng về nội dung này, bạn nên sử dụng thư viện cấp cao hơn.

+0

tôi đã thử làm việc với XML-Sig nhưng nó không hoạt động với ứng dụng của tôi, kết quả xml không được xác thực, tôi đã sử dụng cách tiếp cận này để hiểu rõ hơn toàn bộ quá trình , tôi là một chút mới về chữ ký số và openssl – qateey

+1

@qateey và @daxim, 'XML :: Sig' là * không * một đề xuất tốt: http://matrix.cpantesters.org/?dist=XML-Sig+ Mặt khác, 0.22, 'Net :: SAML2 ': http://matrix.cpantesters.org/?dist=Net-SAML2+0.17 – Axeman

+0

Axeman, bạn phải học cách đọc báo cáo kiểm tra tự động được tóm tắt một cách chính xác. Bạn nên nghi ngờ về một kết quả toàn màu đỏ! Trong trường hợp của XML-Sig, chỉ có một sự thiếu phụ thuộc. Mặt nạ này là một vấn đề thực sự với các khóa DSA và PKCS # 8, nhưng khi qateey giữ phím RSA dài, mô-đun này hoàn toàn có thể phục vụ được. – daxim