如何解决 Android P 中的密码更改?
How to resolve Cryptography Changes in Android P?
首先,我对这个加密操作是新手,不知道我的问题问得对不对!任何解决方案表示赞赏......
在我的项目中,我使用此代码为服务创建 SSLSocketFactory:
public static SSLSocketFactory getGlobalSSlFactory() {
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509", "BC");
InputStream caInput = context.getResources().openRawResource(xxxxxxx);
Certificate ca = cf.generateCertificate(caInput);
caInput.close();
KeyStore keyStore = KeyStore.getInstance("BKS");
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(
KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, "xxxxxxx".toCharArray());
final SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
return sslContext.getSocketFactory();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
在使用 android ( Pie ) 的设备上测试时出现的错误:
google 说:https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html
重要部分:
"To resolve this, you should stop specifying a provider and use the default implementation."
我应该如何更改我的代码?
** 更多解释 **
我按照@sonhvp 所说的做了,但是在测试之后出现了这个错误:
错误出现在这一行:
Certificate ca = cf.generateCertificate(caInput);
这是我的 android 版本:
正如文档所说,"From Android N, we don’t recommend specifying the provider"。因此,只需删除您的加密货币中的所有提供者。
在你的方法中
CertificateFactory cf = CertificateFactory.getInstance("X.509", "BC");
删除提供商("BC")
CertificateFactory cf = CertificateFactory.getInstance("X.509");
其他方法也可以。因为它没有指定提供者
KeyStore.getInstance("BKS"); //no provider
TrustManagerFactory.getInstance(tmfAlgorithm); //no provider
KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); //no provider
SSLContext.getInstance("TLS"); //no provider
原始文件夹中的证书文件有问题。我用您的代码创建了一个 运行 证书文件,没有任何问题。只需更改为 CertificateFactory.getInstance("X.509")
。试试我的 cert file
public class Test {
public Test(AppCompatActivity activity) {
context = activity;
}
private Context context;
public SSLSocketFactory getGlobalSSlFactory() {
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream caInput = context.getResources().openRawResource(R.raw.test);
Certificate ca = cf.generateCertificate(caInput);
caInput.close();
KeyStore keyStore = KeyStore.getInstance("BKS");
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(
KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, "xxxxxxx".toCharArray());
final SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
return sslContext.getSocketFactory();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
我的Activity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val test = Test(this)
test.globalSSlFactory.createSocket()
}
}
首先,我对这个加密操作是新手,不知道我的问题问得对不对!任何解决方案表示赞赏......
在我的项目中,我使用此代码为服务创建 SSLSocketFactory:
public static SSLSocketFactory getGlobalSSlFactory() {
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509", "BC");
InputStream caInput = context.getResources().openRawResource(xxxxxxx);
Certificate ca = cf.generateCertificate(caInput);
caInput.close();
KeyStore keyStore = KeyStore.getInstance("BKS");
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(
KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, "xxxxxxx".toCharArray());
final SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
return sslContext.getSocketFactory();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
在使用 android ( Pie ) 的设备上测试时出现的错误:
google 说:https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html
重要部分:
"To resolve this, you should stop specifying a provider and use the default implementation."
我应该如何更改我的代码?
** 更多解释 **
我按照@sonhvp 所说的做了,但是在测试之后出现了这个错误:
错误出现在这一行:
Certificate ca = cf.generateCertificate(caInput);
这是我的 android 版本:
正如文档所说,"From Android N, we don’t recommend specifying the provider"。因此,只需删除您的加密货币中的所有提供者。
在你的方法中
CertificateFactory cf = CertificateFactory.getInstance("X.509", "BC");
删除提供商("BC")
CertificateFactory cf = CertificateFactory.getInstance("X.509");
其他方法也可以。因为它没有指定提供者
KeyStore.getInstance("BKS"); //no provider
TrustManagerFactory.getInstance(tmfAlgorithm); //no provider
KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); //no provider
SSLContext.getInstance("TLS"); //no provider
原始文件夹中的证书文件有问题。我用您的代码创建了一个 运行 证书文件,没有任何问题。只需更改为 CertificateFactory.getInstance("X.509")
。试试我的 cert file
public class Test {
public Test(AppCompatActivity activity) {
context = activity;
}
private Context context;
public SSLSocketFactory getGlobalSSlFactory() {
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream caInput = context.getResources().openRawResource(R.raw.test);
Certificate ca = cf.generateCertificate(caInput);
caInput.close();
KeyStore keyStore = KeyStore.getInstance("BKS");
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(
KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, "xxxxxxx".toCharArray());
final SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
return sslContext.getSocketFactory();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
我的Activity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val test = Test(this)
test.globalSSlFactory.createSocket()
}
}