2014-07-14 2 views
3

자바에서 이메일 서명에 몇 가지 문제가 있습니다.자바 - 이메일 서명

필자의 코드가 좋다고 생각하지만받은 편지함에있는 전자 메일을 받으면 서명을 확인할 수 없다고합니다.

여기에 코드 - 매우 간단합니다 : 여기

boolean isAlias = false; 

     // Add BouncyCastle content handlers to command map 
     MailcapCommandMap mailcap = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 

     mailcap.addMailcap("application/pkcs7-signature;; x-java-content-handler=org.bouncycastle.superman.mail.smime.handlers.pkcs7_signature"); 
     mailcap.addMailcap("application/pkcs7-mime;; x-java-content-handler=org.bouncycastle.superman.mail.smime.handlers.pkcs7_mime"); 
     mailcap.addMailcap("application/x-pkcs7-signature;; x-java-content-handler=org.bouncycastle.superman.mail.smime.handlers.x_pkcs7_signature"); 
     mailcap.addMailcap("application/x-pkcs7-mime;; x-java-content-handler=org.bouncycastle.superman.mail.smime.handlers.x_pkcs7_mime"); 
     mailcap.addMailcap("multipart/signed;; x-java-content-handler=org.bouncycastle.superman.mail.smime.handlers.multipart_signed"); 

     CommandMap.setDefaultCommandMap(mailcap); 

     Security.addProvider(new BouncyCastleProvider()); 

     KeyStore keyStore = KeyStore.getInstance("JKS"); 

     InputStream ins = SigningEmail.class.getResourceAsStream("/keystore.jks"); 

     // Provide location of Java Keystore and password for access 
     keyStore.load(ins,"changeit".toCharArray()); 

     // Find the first legit alias in the keystore and use it 
     Enumeration<String> es = keyStore.aliases(); 
     String alias = ""; 
     while (es.hasMoreElements()) { 
      alias = es.nextElement(); 

      // Does alias refer to a private key? Assign true/false to isAlias & evaluate 
      if (isAlias = keyStore.isKeyEntry(alias)) { 
       break; 
      } 
     } 
     if (isAlias) { 
      KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(alias, new KeyStore.PasswordProtection("***".toCharArray())); 
      PrivateKey myPrivateKey = pkEntry.getPrivateKey(); 

      // Load certificate chain 
      Certificate[] chain = keyStore.getCertificateChain(alias); 

      // Create the SMIMESignedGenerator 
      SMIMECapabilityVector capabilities = new SMIMECapabilityVector(); 
      capabilities.addCapability(SMIMECapability.dES_EDE3_CBC); 
      capabilities.addCapability(SMIMECapability.rC2_CBC, 128); 
      capabilities.addCapability(SMIMECapability.dES_CBC); 
      capabilities.addCapability(SMIMECapability.aES256_CBC); 
      capabilities.addCapability(SMIMECapability.aES128_CBC); 
      capabilities.addCapability(SMIMECapability.aES192_CBC); 

      //Cert info 
      X500Name x500 = new X500Name(((X509Certificate) chain[0]).getIssuerDN().getName()); 
      IssuerAndSerialNumber serialNumber = new IssuerAndSerialNumber(x500 , ((X509Certificate) chain[0]).getSerialNumber()) ; 

      ASN1EncodableVector signedAttrs = new ASN1EncodableVector(); 
      signedAttrs.add(new SMIMEEncryptionKeyPreferenceAttribute(serialNumber)); 
      signedAttrs.add(new SMIMECapabilitiesAttribute(capabilities)); 

      //Set X509 
      X509Certificate cert = (X509Certificate) keyStore.getCertificate(alias); 
      List<X509Certificate> certList = new ArrayList<X509Certificate>(); 
      certList.add(cert); 
      Store certs = new JcaCertStore(certList); 


      //Signing generator 
      SMIMESignedGenerator gen = new SMIMESignedGenerator(); 
      gen.addSignerInfoGenerator(
         new JcaSimpleSignerInfoGeneratorBuilder() 
          .setProvider("BC") 
          .setSignedAttributeGenerator(new AttributeTable(signedAttrs)) 
          .build("SHA1withRSA", myPrivateKey, cert)); 
      gen.addCertificates(certs); 

      MimeMessage cloneOriginal = new MimeMessage(body); 

      //Sign 
      MimeMultipart mainPart = gen.generate(body , "BC"); 

      // Set the content of the signed message 
      cloneOriginal.setContent(mainPart, mainPart.getContentType()); 
      cloneOriginal.saveChanges(); 

      // Send the message 
      sender.send(cloneOriginal); 

내가 메일에서 얻을 :

내가 그 명령을 사용하여 키스톤 생성하는 .PFX을 사용 :

키 도구를 - importkeystore -srckeystore /Users/sign.pfx -rcstoretype pkcs12 -destkeystore /Users/keystore.jks -deststoretype jks

기관과 모든 기관이 서명했습니다.

그래서 수입품 및 부호는 나에게 좋게 본다 그러나 나는 일하지 않으며, 나가 놓치는 무엇을 생각해보고있다.

감사합니다.

답변

1

내가 아는 한, GoDaddy는 이메일 서명 인증서를 판매하지 않습니다. 구하는 방법을 알고 싶으시면 this review by mozillathis을 읽어보십시오.

  1. 웹 서버 인증 인증서
  2. 통합 커뮤니케이션 (UC) 인증서
  3. 와일드 카드 인증서
  4. 확장 유효성 검사 인증서
  5. 낮은 보증/도메인 검증 인증서
  6. : This article 인증서의 여러 종류를 설명 코드 서명 인증서
  7. 전자 메일 인증서
  8. 루트 서명 인증서

SSL 인증서 유형 당신은 그것을 수행하는 것은 아닙니다 무언가에 대한 인증서를 사용하려고 시도로 많은 문제를 방지 할 수 있습니다 알면.

0

코드 실행을 위해 공급자를 편집해야했지만 그 코드는 저에게 효과적이었습니다. 감사!

MailcapCommandMap mailcap = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 

mailcap.addMailcap("application/pkcs7-signature;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.pkcs7_signature"); 
mailcap.addMailcap("application/pkcs7-mime;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.pkcs7_mime"); 
mailcap.addMailcap("application/x-pkcs7-signature;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.x_pkcs7_signature"); 
mailcap.addMailcap("application/x-pkcs7-mime;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.x_pkcs7_mime"); 
mailcap.addMailcap("multipart/signed;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.multipart_signed"); 
mailcap.addMailcap("multipart/signed;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.multipart_signed");