Java源码示例:com.google.api.client.util.SecurityUtils
示例1
/**
* Verifies the signature of the content.
*
* <p>Currently only {@code "RS256"} and {@code "ES256"} algorithms are verified, but others may
* be added in the future. For any other algorithm it returns {@code false}.
*
* @param publicKey public key
* @return whether the algorithm is recognized and it is verified
* @throws GeneralSecurityException
*/
public final boolean verifySignature(PublicKey publicKey) throws GeneralSecurityException {
String algorithm = getHeader().getAlgorithm();
if ("RS256".equals(algorithm)) {
return SecurityUtils.verify(
SecurityUtils.getSha256WithRsaSignatureAlgorithm(),
publicKey,
signatureBytes,
signedContentBytes);
} else if ("ES256".equals(algorithm)) {
return SecurityUtils.verify(
SecurityUtils.getEs256SignatureAlgorithm(),
publicKey,
DerEncoder.encode(signatureBytes),
signedContentBytes);
} else {
return false;
}
}
示例2
/**
* Signs a given JWS header and payload based on the given private key using RSA and SHA-256 as
* described in <a
* href="http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-11#appendix-A.2">JWS using
* RSA SHA-256</a>.
*
* @param privateKey private key
* @param jsonFactory JSON factory
* @param header JWS header
* @param payload JWS payload
* @return signed JWS string
* @since 1.14 (since 1.7 as com.google.api.client.auth.jsontoken.RsaSHA256Signer)
*/
public static String signUsingRsaSha256(
PrivateKey privateKey,
JsonFactory jsonFactory,
JsonWebSignature.Header header,
JsonWebToken.Payload payload)
throws GeneralSecurityException, IOException {
String content =
Base64.encodeBase64URLSafeString(jsonFactory.toByteArray(header))
+ "."
+ Base64.encodeBase64URLSafeString(jsonFactory.toByteArray(payload));
byte[] contentBytes = StringUtils.getBytesUtf8(content);
byte[] signature =
SecurityUtils.sign(
SecurityUtils.getSha256WithRsaSignatureAlgorithm(), privateKey, contentBytes);
return content + "." + Base64.encodeBase64URLSafeString(signature);
}
示例3
public static GoogleCredential buildCredential(CloudCredential gcpCredential, HttpTransport httpTransport) throws IOException, GeneralSecurityException {
String credentialJson = getServiceAccountCredentialJson(gcpCredential);
if (isNotEmpty(credentialJson)) {
return GoogleCredential.fromStream(new ByteArrayInputStream(Base64.decodeBase64(credentialJson)), httpTransport, JSON_FACTORY)
.createScoped(SCOPES);
} else {
try {
PrivateKey pk = SecurityUtils.loadPrivateKeyFromKeyStore(SecurityUtils.getPkcs12KeyStore(),
new ByteArrayInputStream(Base64.decodeBase64(getServiceAccountPrivateKey(gcpCredential))), "notasecret", "privatekey", "notasecret");
return new GoogleCredential.Builder().setTransport(httpTransport)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(getServiceAccountId(gcpCredential))
.setServiceAccountScopes(SCOPES)
.setServiceAccountPrivateKey(pk)
.build();
} catch (IOException e) {
throw new CredentialVerificationException("Can not read private key", e);
}
}
}
示例4
@Override
public byte[] sign(byte[] payload) throws IOException {
try {
return SecurityUtils.sign(SecurityUtils.getSha256WithRsaSignatureAlgorithm(),
privateKey, payload);
} catch (GeneralSecurityException e) {
throw new IOException(e);
}
}
示例5
/**
* {@link Beta} <br>
* Verifies the signature of the content using the certificate chain embedded in the signature.
*
* <p>Currently only {@code "RS256"} and {@code "ES256"} algorithms are verified, but others may
* be added in the future. For any other algorithm it returns {@code null}.
*
* <p>The leaf certificate of the certificate chain must be an SSL server certificate.
*
* @param trustManager trust manager used to verify the X509 certificate chain embedded in this
* message
* @return the signature certificate if the signature could be verified, null otherwise
* @throws GeneralSecurityException
* @since 1.19.1
*/
@Beta
public final X509Certificate verifySignature(X509TrustManager trustManager)
throws GeneralSecurityException {
List<String> x509Certificates = getHeader().getX509Certificates();
if (x509Certificates == null || x509Certificates.isEmpty()) {
return null;
}
String algorithm = getHeader().getAlgorithm();
if ("RS256".equals(algorithm)) {
return SecurityUtils.verify(
SecurityUtils.getSha256WithRsaSignatureAlgorithm(),
trustManager,
x509Certificates,
signatureBytes,
signedContentBytes);
} else if ("ES256".equals(algorithm)) {
return SecurityUtils.verify(
SecurityUtils.getEs256SignatureAlgorithm(),
trustManager,
x509Certificates,
DerEncoder.encode(signatureBytes),
signedContentBytes);
} else {
return null;
}
}
示例6
public static Analytics buildClient(GoogleAnalytics googleAnalytics) {
Analytics analytics;
try {
PrivateKey privateKey= SecurityUtils.loadPrivateKeyFromKeyStore(
SecurityUtils.getPkcs12KeyStore(), new ByteArrayInputStream(googleAnalytics.getServiceAccountP12FileContent()),
"notasecret", "privatekey", "notasecret");
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
Set<String> scopes = new HashSet<>();
scopes.add(AnalyticsScopes.ANALYTICS_READONLY);
final GoogleCredential credential = new GoogleCredential.Builder().setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(googleAnalytics.getServiceAccountId())
.setServiceAccountScopes(scopes)
.setServiceAccountPrivateKey(privateKey)
.build();
HttpRequestInitializer httpRequestInitializer = new HttpRequestInitializer() {
@Override
public void initialize(HttpRequest httpRequest) throws IOException {
credential.initialize(httpRequest);
httpRequest.setConnectTimeout(3 * 60000); // 3 minutes connect timeout
httpRequest.setReadTimeout(3 * 60000); // 3 minutes read timeout
}
};
analytics = new Analytics.Builder(httpTransport, jsonFactory, httpRequestInitializer)
.setApplicationName("WallRide")
.build();
} catch (Exception e) {
logger.warn("Failed to synchronize with Google Analytics", e);
throw new GoogleAnalyticsException(e);
}
return analytics;
}
示例7
private static PrivateKey privateKeyFromPkcs8(String privateKeyPem) throws IOException {
Reader reader = new StringReader(privateKeyPem);
Section section = PemReader.readFirstSectionAndClose(reader, "PRIVATE KEY");
if (section == null) {
throw new IOException("Invalid PKCS8 data.");
}
byte[] bytes = section.getBase64DecodedBytes();
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
try {
KeyFactory keyFactory = SecurityUtils.getRsaKeyFactory();
return keyFactory.generatePrivate(keySpec);
} catch (NoSuchAlgorithmException | InvalidKeySpecException exception) {
throw new IOException("Unexpected exception reading PKCS data", exception);
}
}
示例8
/**
* Forces a refresh of the public certificates downloaded from {@link #getPublicCertsEncodedUrl}.
*
* <p>
* This method is automatically called from {@link #getPublicKeys()} if the public keys have not
* yet been initialized or if the expiration time is very close, so normally this doesn't need to
* be called. Only call this method to explicitly force the public keys to be updated.
* </p>
*/
public GooglePublicKeysManager refresh() throws GeneralSecurityException, IOException {
lock.lock();
try {
publicKeys = new ArrayList<PublicKey>();
// HTTP request to public endpoint
CertificateFactory factory = SecurityUtils.getX509CertificateFactory();
HttpResponse certsResponse = transport.createRequestFactory()
.buildGetRequest(new GenericUrl(publicCertsEncodedUrl)).execute();
expirationTimeMilliseconds =
clock.currentTimeMillis() + getCacheTimeInSec(certsResponse.getHeaders()) * 1000;
// parse each public key in the JSON response
JsonParser parser = jsonFactory.createJsonParser(certsResponse.getContent());
JsonToken currentToken = parser.getCurrentToken();
// token is null at start, so get next token
if (currentToken == null) {
currentToken = parser.nextToken();
}
Preconditions.checkArgument(currentToken == JsonToken.START_OBJECT);
try {
while (parser.nextToken() != JsonToken.END_OBJECT) {
parser.nextToken();
String certValue = parser.getText();
X509Certificate x509Cert = (X509Certificate) factory.generateCertificate(
new ByteArrayInputStream(StringUtils.getBytesUtf8(certValue)));
publicKeys.add(x509Cert.getPublicKey());
}
publicKeys = Collections.unmodifiableList(publicKeys);
} finally {
parser.close();
}
return this;
} finally {
lock.unlock();
}
}
示例9
/**
* Returns the key store for trusted root certificates to use for Google APIs.
*
* <p>Value is cached, so subsequent access is fast.
*
* @since 1.14
*/
public static synchronized KeyStore getCertificateTrustStore()
throws IOException, GeneralSecurityException {
if (certTrustStore == null) {
certTrustStore = SecurityUtils.getJavaKeyStore();
InputStream keyStoreStream = GoogleUtils.class.getResourceAsStream("google.jks");
SecurityUtils.loadKeyStore(certTrustStore, keyStoreStream, "notasecret");
}
return certTrustStore;
}
示例10
public void testComputeSignature() throws GeneralSecurityException {
OAuthRsaSigner signer = new OAuthRsaSigner();
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024);
signer.privateKey = keyPairGenerator.genKeyPair().getPrivate();
byte[] expected = SecurityUtils.sign(
SecurityUtils.getSha1WithRsaSignatureAlgorithm(), signer.privateKey,
StringUtils.getBytesUtf8("foo"));
assertEquals(Base64.encodeBase64String(expected), signer.computeSignature("foo"));
}
示例11
public Certificate getCertfificate() throws IOException, CertificateException {
byte[] bytes = getDer();
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
return SecurityUtils.getX509CertificateFactory().generateCertificate(bis);
}
示例12
/** Returns a new sample RSA private key that matches {@link #newRsaPublicKey()}. */
public static RSAPrivateKey newRsaPrivateKey() throws GeneralSecurityException {
KeyFactory keyFactory = SecurityUtils.getRsaKeyFactory();
KeySpec keySpec = new PKCS8EncodedKeySpec(ENCODED_PRIVATE_KEY);
return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
}
示例13
/** Returns a new sample RSA public key that matches {@link #newRsaPrivateKey()}. */
public static RSAPublicKey newRsaPublicKey() throws GeneralSecurityException {
KeyFactory keyFactory = SecurityUtils.getRsaKeyFactory();
KeySpec keySpec = new X509EncodedKeySpec(ENCODED_PUBLIC_KEY);
return (RSAPublicKey) keyFactory.generatePublic(keySpec);
}
示例14
public String computeSignature(String signatureBaseString) throws GeneralSecurityException {
Signature signer = SecurityUtils.getSha1WithRsaSignatureAlgorithm();
byte[] data = StringUtils.getBytesUtf8(signatureBaseString);
return Base64.encodeBase64String(SecurityUtils.sign(signer, privateKey, data));
}
示例15
/**
* Sets the SSL socket factory based on root certificates in a Java KeyStore.
*
* <p>Example usage:
*
* <pre>
* trustCertificatesFromJavaKeyStore(new FileInputStream("certs.jks"), "password");
* </pre>
*
* @param keyStoreStream input stream to the key store (closed at the end of this method in a
* finally block)
* @param storePass password protecting the key store file
* @since 1.14
*/
public Builder trustCertificatesFromJavaKeyStore(InputStream keyStoreStream, String storePass)
throws GeneralSecurityException, IOException {
KeyStore trustStore = SecurityUtils.getJavaKeyStore();
SecurityUtils.loadKeyStore(trustStore, keyStoreStream, storePass);
return trustCertificates(trustStore);
}
示例16
/**
* Sets the SSL socket factory based root certificates generated from the specified stream using
* {@link CertificateFactory#generateCertificates(InputStream)}.
*
* <p>Example usage:
*
* <pre>
* trustCertificatesFromStream(new FileInputStream("certs.pem"));
* </pre>
*
* @param certificateStream certificate stream
* @since 1.14
*/
public Builder trustCertificatesFromStream(InputStream certificateStream)
throws GeneralSecurityException, IOException {
KeyStore trustStore = SecurityUtils.getJavaKeyStore();
trustStore.load(null, null);
SecurityUtils.loadKeyStoreFromCertificates(
trustStore, SecurityUtils.getX509CertificateFactory(), certificateStream);
return trustCertificates(trustStore);
}
示例17
/**
* Sets the SSL socket factory based on root certificates in a Java KeyStore.
*
* <p>Example usage:
*
* <pre>
* trustCertificatesFromJavaKeyStore(new FileInputStream("certs.jks"), "password");
* </pre>
*
* @param keyStoreStream input stream to the key store (closed at the end of this method in a
* finally block)
* @param storePass password protecting the key store file
* @since 1.14
*/
public Builder trustCertificatesFromJavaKeyStore(InputStream keyStoreStream, String storePass)
throws GeneralSecurityException, IOException {
KeyStore trustStore = SecurityUtils.getJavaKeyStore();
SecurityUtils.loadKeyStore(trustStore, keyStoreStream, storePass);
return trustCertificates(trustStore);
}
示例18
/**
* Sets the SSL socket factory based root certificates generated from the specified stream using
* {@link CertificateFactory#generateCertificates(InputStream)}.
*
* <p>Example usage:
*
* <pre>
* trustCertificatesFromStream(new FileInputStream("certs.pem"));
* </pre>
*
* @param certificateStream certificate stream
* @since 1.14
*/
public Builder trustCertificatesFromStream(InputStream certificateStream)
throws GeneralSecurityException, IOException {
KeyStore trustStore = SecurityUtils.getJavaKeyStore();
trustStore.load(null, null);
SecurityUtils.loadKeyStoreFromCertificates(
trustStore, SecurityUtils.getX509CertificateFactory(), certificateStream);
return trustCertificates(trustStore);
}
示例19
/**
* Sets the private key to use with the service account flow or {@code null} for none.
*
* <p>
* Overriding is only supported for the purpose of calling the super implementation and changing
* the return type, but nothing else.
* </p>
*
* @param p12FileInputStream input stream to the p12 file. This file is closed at the end of
* this method in a finally block.
*/
public Builder setServiceAccountPrivateKeyFromP12File(InputStream p12FileInputStream)
throws GeneralSecurityException, IOException {
serviceAccountPrivateKey = SecurityUtils.loadPrivateKeyFromKeyStore(
SecurityUtils.getPkcs12KeyStore(), p12FileInputStream, "notasecret",
"privatekey", "notasecret");
return this;
}
示例20
/**
* {@link Beta} <br/>
* Sets the private key to use with the service account flow or {@code null} for none.
*
* <p>
* Overriding is only supported for the purpose of calling the super implementation and changing
* the return type, but nothing else.
* </p>
*
* @param pemFile input stream to the PEM file (closed at the end of this method in a finally
* block)
* @since 1.13
*/
@Beta
public Builder setServiceAccountPrivateKeyFromPemFile(File pemFile)
throws GeneralSecurityException, IOException {
byte[] bytes = PemReader.readFirstSectionAndClose(new FileReader(pemFile), "PRIVATE KEY")
.getBase64DecodedBytes();
serviceAccountPrivateKey =
SecurityUtils.getRsaKeyFactory().generatePrivate(new PKCS8EncodedKeySpec(bytes));
return this;
}