CertificateInfo Class — spring-boot Architecture
Architecture documentation for the CertificateInfo class in SslInfo.java from the spring-boot codebase.
Entity Profile
Relationship Graph
Source Code
core/spring-boot/src/main/java/org/springframework/boot/info/SslInfo.java lines 201–273
public final class CertificateInfo {
private final @Nullable X509Certificate certificate;
private CertificateInfo(Certificate certificate) {
this.certificate = (certificate instanceof X509Certificate x509Certificate) ? x509Certificate : null;
}
public @Nullable String getSubject() {
return extract(X509Certificate::getSubjectX500Principal, X500Principal::getName);
}
public @Nullable String getIssuer() {
return extract(X509Certificate::getIssuerX500Principal, X500Principal::getName);
}
public @Nullable String getSerialNumber() {
return extract(X509Certificate::getSerialNumber, (serial) -> serial.toString(16));
}
public @Nullable String getVersion() {
return extract((certificate) -> "V" + certificate.getVersion());
}
public @Nullable String getSignatureAlgorithmName() {
return extract(X509Certificate::getSigAlgName);
}
public @Nullable Instant getValidityStarts() {
return extract(X509Certificate::getNotBefore, Date::toInstant);
}
public @Nullable Instant getValidityEnds() {
return extract(X509Certificate::getNotAfter, Date::toInstant);
}
public @Nullable CertificateValidityInfo getValidity() {
return extract((certificate) -> {
Instant starts = getValidityStarts();
Instant ends = getValidityEnds();
Assert.state(starts != null, "Validity start not found");
Assert.state(ends != null, "Validity end not found");
CertificateValidityInfo.Status validity = checkValidity(starts, ends);
return switch (validity) {
case VALID -> CertificateValidityInfo.VALID;
case EXPIRED -> new CertificateValidityInfo(Status.EXPIRED, "Not valid after %s", ends);
case NOT_YET_VALID ->
new CertificateValidityInfo(Status.NOT_YET_VALID, "Not valid before %s", starts);
};
});
}
private CertificateValidityInfo.Status checkValidity(Instant starts, Instant ends) {
Instant now = SslInfo.this.clock.instant();
if (now.isBefore(starts)) {
return CertificateValidityInfo.Status.NOT_YET_VALID;
}
if (now.isAfter(ends)) {
return CertificateValidityInfo.Status.EXPIRED;
}
return CertificateValidityInfo.Status.VALID;
}
private <V, R> @Nullable R extract(Function<X509Certificate, V> valueExtractor,
Function<V, R> resultExtractor) {
return extract(valueExtractor.andThen(resultExtractor));
}
private <R> @Nullable R extract(Function<X509Certificate, R> extractor) {
return (this.certificate != null) ? extractor.apply(this.certificate) : null;
}
}
Domain
Source
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free