java - tutorial - libreria bouncycastle
Problemas de instalaciĆ³n de BouncyCastle (2)
La opción -providerName
requiere un nombre de proveedor ("BC", en este caso), no un nombre de clase . Una opción alternativa, -providerClass
, requiere un nombre de clase, y es útil cuando el proveedor no está registrado en el archivo java.security
.
Cuando se registra un proveedor "programáticamente", es sólo temporal. Su programa debe volver a registrar su proveedor cada vez que se ejecuta. No podrá utilizar este enfoque si su objetivo es hacer que BouncyCastle esté disponible para keytool
.
Como ya instaló el proveedor (colocando el archivo en lib/ext
y listándolo en java.security
), usar la opción java.security
-providerName BC
es probablemente la solución más fácil. Alternativamente, puede usar la opción -providerClass org.bouncycastle.jce.provider.BouncyCastleProvider
.
Por cierto, no debes usar la variable de entorno CLASSPATH
. Las bibliotecas en lib/ext
están en la ruta de clases.
Si, después de corregir las opciones, sigue obteniendo una NoSuchProviderException
(usando NoSuchProviderException
) o ClassNotFoundException
(usando -providerClass
), verifique que esté usando la copia correcta de keytool
. Es decir, al ejecutar, especifique la ruta completa de keytool
, en lugar de confiar en su variable PATH
. Asegúrese de que la ruta se refiera al JRE en el que se instaló BouncyCastle. No es raro que un sistema tenga múltiples JRE y JDK.
Estoy tratando de agregar BouncyCastle como proveedor de seguridad en Windows XP Pro, así que puedo usarlo para agregar algunos certificados a una aplicación de Android según las instrucciones here . Desafortunadamente no puedo conseguir que agregue el proveedor.
He:
- Descargué el proveedor en
C:/Program Files/Java/jre6/lib/ext/
. - Se agregó
C:/Program Files/Java/jre6/lib/ext/bcprov-jdk16-146.jar
a%CLASSPATH%
. - Se agregó
security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider
a java.security (7 es el siguiente int en el pedido).
Cuando corro
keytool -import -v -trustcacerts -alias 0 -file mycert.crt -keystore mystore.bks -storetype BKS -providerName org.bouncycastle.jce.provider.BouncyCastleProvider -storepass mypassword
Recibo el siguiente mensaje de error:
keytool error: java.lang.ClassNotFoundException: org.bouncycastle.jce.provider.BouncyCastleProvider
También he intentado agregarlo dinámicamente:
import java.security.Provider;
import java.security.Security;
import java.util.Enumeration;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class BouncyCastleMain {
public static void main(String[] args) throws Exception {
Security.addProvider(new BouncyCastleProvider()); // add it
try { // list them out
Provider p[] = Security.getProviders();
for (int i = 0; i < p.length; i++) {
System.out.println(p[i]);
for (Enumeration<?> e = p[i].keys(); e.hasMoreElements();)
System.out.println("/t" + e.nextElement());
}
} catch (Exception e) {
System.out.println(e);
}
}
}
Al principio obtuve un error de acceso al compilar la clase java, pero lo cambié a una advertencia según la sugerencia here . Ahora, cuando ejecuto el código, se muestra BouncyCastle en la lista de proveedores, pero no se queda después de que el programa finaliza.
Estoy seguro de que debe ser factible, pero estoy obstaculizado sobre cómo instalar a este tipo el tiempo suficiente para ejecutar keytool usándolo. ¿Es posible ejecutar keytool a través de una API de Java, o podría haber algún paso que haya omitido para que el proveedor se quede con el equipo?
¡Gracias!
Si está en Windows, no olvide iniciar la línea de comandos como administrador para ingresar los comandos keytool.