0

私は明らかにここで基本的な何かを見逃しています。私は次のScalaコードを持っています:

package org.carlskii

import java.io._
import java.security.cert.CertificateFactory
import java.security.Security
import org.bouncycastle.jce.provider._

object Main extends App {

  Security.addProvider(new BouncyCastleProvider)
  val provider = new BouncyCastleProvider
  val in = new FileInputStream("cert.cer")
  val certificateFactory = CertificateFactory.getInstance("X509", provider)
  val certificate = certificateFactory.generateCertificate(file)
  println(certificate.getClass)

} 

これを生成します:

class org.bouncycastle.jce.provider.X509CertificateObject

だから私は弾力がある城のX509CertificateObjectオブジェクトを持っています。このメソッドを呼び出すとcertificate.getPublicKey、証明書の公開鍵が正しく返されます。

ただし、呼び出すcertificate.getSerialNumberと次のエラーがスローされます。

error: value getSerialNumber is not a member of java.security.cert.Certificate
println(certificate.getSerialNumber)

ここで興味深いのは、Scalaがそれをオブジェクトjava.security.cert.Certificateではなくorg.bouncycastle.jce.provider.X509CertificateObjectオブジェクトであると考えていることです。なぜそうなのですか?

4

2 に答える 2

3

generateCertificateメソッドは、Certificateオブジェクトを返します。結果をキャストするだけの場合は、次のようになりますorg.bouncycastle.jce.provider.X509CertificateObject

package org.carlskii

import java.io._
import java.security.cert.CertificateFactory
import java.security.Security
import org.bouncycastle.jce.provider._

object Main extends App {

  Security.addProvider(new BouncyCastleProvider)
  val provider = new BouncyCastleProvider
  val in = new FileInputStream("cert.cer")
  val certificateFactory = CertificateFactory.getInstance("X509", provider)
  val certificate = certificateFactory.generateCertificate(file).asInstanceOf[X509CertificateObject]
  println(certificate.getClass)

} 
于 2012-11-04T15:23:06.597 に答える
1

メソッド generateCertificate はタイプ Certificate を返すため、val certificate はタイプ certificate を持つと推測されます。メソッド generateCertificate には、次のメソッド シグネチャがあります。

Certificate generateCertificate(InputStream inStream)

この呼び出しの結果を val に割り当てると、scala コンパイラーは証明書のタイプを推測します。それは、generateCertificate メソッドが返すタイプの Certificate です。

したがって、X509CertificateObject の型で定義されているメソッドを呼び出したい場合は、最初にそれを正しい型にキャストする必要があります。

certificate.asInstanceOf[X509CertificateObject]

getClass から得られるのは、オブジェクトの実行時クラスです。

于 2012-11-04T15:07:06.733 に答える