提交 b36f18b6 编写于 作者: I igerasim

8181370: Better keystore handling

Reviewed-by: weijun, igerasim
上级 27acb743
/* /*
* Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -27,12 +27,14 @@ package com.sun.crypto.provider; ...@@ -27,12 +27,14 @@ package com.sun.crypto.provider;
import java.io.*; import java.io.*;
import java.util.*; import java.util.*;
import java.security.AccessController;
import java.security.DigestInputStream; import java.security.DigestInputStream;
import java.security.DigestOutputStream; import java.security.DigestOutputStream;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.Key; import java.security.Key;
import java.security.PrivateKey; import java.security.PrivateKey;
import java.security.PrivilegedAction;
import java.security.KeyStoreSpi; import java.security.KeyStoreSpi;
import java.security.KeyStoreException; import java.security.KeyStoreException;
import java.security.UnrecoverableKeyException; import java.security.UnrecoverableKeyException;
...@@ -41,6 +43,8 @@ import java.security.cert.CertificateFactory; ...@@ -41,6 +43,8 @@ import java.security.cert.CertificateFactory;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
import javax.crypto.SealedObject; import javax.crypto.SealedObject;
import sun.misc.ObjectInputFilter;
/** /**
* This class provides the keystore implementation referred to as "jceks". * This class provides the keystore implementation referred to as "jceks".
* This implementation strongly protects the keystore private keys using * This implementation strongly protects the keystore private keys using
...@@ -835,11 +839,21 @@ public final class JceKeyStore extends KeyStoreSpi { ...@@ -835,11 +839,21 @@ public final class JceKeyStore extends KeyStoreSpi {
// read the sealed key // read the sealed key
try { try {
ois = new ObjectInputStream(dis); ois = new ObjectInputStream(dis);
final ObjectInputStream ois2 = ois;
// Set a deserialization checker
AccessController.doPrivileged(
(PrivilegedAction<Void>)() -> {
ObjectInputFilter.Config.setObjectInputFilter(
ois2, new DeserializationChecker());
return null;
});
entry.sealedKey = (SealedObject)ois.readObject(); entry.sealedKey = (SealedObject)ois.readObject();
// NOTE: don't close ois here since we are still // NOTE: don't close ois here since we are still
// using dis!!! // using dis!!!
} catch (ClassNotFoundException cnfe) { } catch (ClassNotFoundException cnfe) {
throw new IOException(cnfe.getMessage()); throw new IOException(cnfe.getMessage());
} catch (InvalidClassException ice) {
throw new IOException("Invalid secret key format");
} }
// Add the entry to the list // Add the entry to the list
...@@ -900,4 +914,34 @@ public final class JceKeyStore extends KeyStoreSpi { ...@@ -900,4 +914,34 @@ public final class JceKeyStore extends KeyStoreSpi {
md.update("Mighty Aphrodite".getBytes("UTF8")); md.update("Mighty Aphrodite".getBytes("UTF8"));
return md; return md;
} }
/*
* An ObjectInputFilter that checks the format of the secret key being
* deserialized.
*/
private static class DeserializationChecker implements ObjectInputFilter {
private static final int MAX_NESTED_DEPTH = 2;
@Override
public ObjectInputFilter.Status
checkInput(ObjectInputFilter.FilterInfo info) {
// First run a custom filter
long nestedDepth = info.depth();
if ((nestedDepth == 1 &&
info.serialClass() != SealedObjectForKeyProtector.class) ||
nestedDepth > MAX_NESTED_DEPTH) {
return Status.REJECTED;
}
// Next run the default filter, if available
ObjectInputFilter defaultFilter =
ObjectInputFilter.Config.getSerialFilter();
if (defaultFilter != null) {
return defaultFilter.checkInput(info);
}
return Status.UNDECIDED;
}
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册