📄 certutil.c
字号:
status = cryptGetAttributeString( certificate,
CRYPT_CERTINFO_STATEORPROVINCENAME, buffer, &length );
if( cryptStatusOK( status ) )
{ buffer[ length ] = '\0'; printf( " S = %s.\n", buffer ); }
status = cryptGetAttributeString( certificate,
CRYPT_CERTINFO_LOCALITYNAME, buffer, &length );
if( cryptStatusOK( status ) )
{ buffer[ length ] = '\0'; printf( " L = %s.\n", buffer ); }
status = cryptGetAttributeString( certificate,
CRYPT_CERTINFO_ORGANIZATIONNAME, buffer, &length );
if( cryptStatusOK( status ) )
{ buffer[ length ] = '\0'; printf( " O = %s.\n", buffer ); }
status = cryptGetAttributeString( certificate,
CRYPT_CERTINFO_ORGANIZATIONALUNITNAME, buffer, &length );
if( cryptStatusOK( status ) )
{ buffer[ length ] = '\0'; printf( " OU = %s.\n", buffer ); }
status = cryptGetAttributeString( certificate,
CRYPT_CERTINFO_COMMONNAME, buffer, &length );
if( cryptStatusOK( status ) )
{ buffer[ length ] = '\0'; printf( " CN = %s.\n", buffer ); }
}
/* Print an altName */
static void printAltName( const CRYPT_CERTIFICATE certificate )
{
char buffer[ 512 ];
int length, status;
status = cryptGetAttributeString( certificate,
CRYPT_CERTINFO_RFC822NAME, buffer, &length );
if( cryptStatusOK( status ) )
{ buffer[ length ] = '\0'; printf( " Email = %s.\n", buffer ); }
status = cryptGetAttributeString( certificate,
CRYPT_CERTINFO_DNSNAME, buffer, &length );
if( cryptStatusOK( status ) )
{ buffer[ length ] = '\0'; printf( " DNSName = %s.\n", buffer ); }
status = cryptGetAttributeString( certificate,
CRYPT_CERTINFO_EDIPARTYNAME_NAMEASSIGNER, buffer, &length );
if( cryptStatusOK( status ) )
{ buffer[ length ] = '\0'; printf( " EDI Nameassigner = %s.\n", buffer ); }
status = cryptGetAttributeString( certificate,
CRYPT_CERTINFO_EDIPARTYNAME_PARTYNAME, buffer, &length );
if( cryptStatusOK( status ) )
{ buffer[ length ] = '\0'; printf( " EDI Partyname = %s.\n", buffer ); }
status = cryptGetAttributeString( certificate,
CRYPT_CERTINFO_UNIFORMRESOURCEIDENTIFIER, buffer, &length );
if( cryptStatusOK( status ) )
{ buffer[ length ] = '\0'; printf( " URL = %s.\n", buffer ); }
status = cryptGetAttributeString( certificate,
CRYPT_CERTINFO_IPADDRESS, buffer, &length );
if( cryptStatusOK( status ) )
{ buffer[ length ] = '\0'; printf( " IP = %s.\n", buffer ); }
status = cryptGetAttributeString( certificate,
CRYPT_CERTINFO_REGISTEREDID, buffer, &length );
if( cryptStatusOK( status ) )
{ buffer[ length ] = '\0'; printf( " Registered ID = %s.\n", buffer ); }
status = cryptSetAttribute( certificate, CRYPT_CERTINFO_DIRECTORYNAME,
CRYPT_UNUSED );
if( cryptStatusOK( status ) )
{
printf( " altName DN is:\n" );
printDN( certificate );
}
}
/* The following function performs many attribute accesses, rather than using
huge numbers of status checks we use the following macro to check each
attribute access */
#define CHK( function ) \
status = function; \
if( cryptStatusError( status ) ) \
return( certInfoErrorExit( #function, status, __LINE__ ) )
static int certInfoErrorExit( const char *functionCall, const int status,
const int line )
{
printf( "\n%s failed with status %d, line %d.\n", functionCall,
status, line );
return( FALSE );
}
/* Print information on a certificate */
int printCertInfo( const CRYPT_CERTIFICATE certificate )
{
CRYPT_CERTTYPE_TYPE certType;
BOOLEAN hasExtensions = FALSE;
char buffer[ CRYPT_MAX_TEXTSIZE + 1 ];
int length, value, status;
cryptGetAttribute( certificate, CRYPT_CERTINFO_CERTTYPE, &value );
certType = value;
/* Display the issuer and subject DN */
if( certType != CRYPT_CERTTYPE_CERTREQUEST && \
certType != CRYPT_CERTTYPE_REQUEST_CERT && \
certType != CRYPT_CERTTYPE_REQUEST_REVOCATION && \
certType != CRYPT_CERTTYPE_OCSP_REQUEST && \
certType != CRYPT_CERTTYPE_CMS_ATTRIBUTES && \
certType != CRYPT_CERTTYPE_PKIUSER )
{
puts( "Certificate object issuer name is:" );
CHK( cryptSetAttribute( certificate, CRYPT_CERTINFO_ISSUERNAME,
CRYPT_UNUSED ) );
printDN( certificate );
status = cryptSetAttribute( certificate, CRYPT_CERTINFO_ISSUERALTNAME,
CRYPT_UNUSED );
if( cryptStatusOK( status ) )
printAltName( certificate );
}
if( certType != CRYPT_CERTTYPE_CRL && \
certType != CRYPT_CERTTYPE_REQUEST_REVOCATION && \
certType != CRYPT_CERTTYPE_CMS_ATTRIBUTES && \
certType != CRYPT_CERTTYPE_OCSP_REQUEST && \
certType != CRYPT_CERTTYPE_OCSP_RESPONSE )
{
puts( "Certificate object subject name is:" );
CHK( cryptSetAttribute( certificate, CRYPT_CERTINFO_SUBJECTNAME,
CRYPT_UNUSED ) );
printDN( certificate );
status = cryptSetAttribute( certificate, CRYPT_CERTINFO_SUBJECTALTNAME,
CRYPT_UNUSED );
if( cryptStatusOK( status ) )
printAltName( certificate );
}
/* Display the validity information */
if( certType == CRYPT_CERTTYPE_CERTCHAIN ||
certType == CRYPT_CERTTYPE_CERTIFICATE || \
certType == CRYPT_CERTTYPE_ATTRIBUTE_CERT )
{
time_t validFrom, validTo;
char buffer[ 50 ];
CHK( cryptGetAttributeString( certificate, CRYPT_CERTINFO_VALIDFROM,
&validFrom, &length ) );
CHK( cryptGetAttributeString( certificate, CRYPT_CERTINFO_VALIDTO,
&validTo, &length ) );
strcpy( buffer, ctime( &validFrom ) );
buffer[ strlen( buffer ) - 1 ] = '\0'; /* Stomp '\n' */
printf( "Certificate is valid from %s to %s", buffer,
ctime( &validTo ) );
}
if( certType == CRYPT_CERTTYPE_OCSP_RESPONSE )
{
if( cryptStatusOK( cryptGetAttribute( certificate,
CRYPT_CERTINFO_REVOCATIONSTATUS, &value ) ) )
printf( "Certificate revocation status = %s.\n",
( value == CRYPT_OCSPSTATUS_NOTREVOKED ) ? "not revoked" : \
( value == CRYPT_OCSPSTATUS_REVOKED ) ? "revoked" : "unknown" );
}
if( certType == CRYPT_CERTTYPE_CRL || \
certType == CRYPT_CERTTYPE_OCSP_RESPONSE )
{
char tuBuffer[ 50 ], nuBuffer[ 50 ];
time_t timeStamp;
int noEntries = 0;
CHK( cryptGetAttributeString( certificate, CRYPT_CERTINFO_THISUPDATE,
&timeStamp, &length ) );
strcpy( tuBuffer, ctime( &timeStamp ) );
tuBuffer[ strlen( tuBuffer ) - 1 ] = '\0'; /* Stomp '\n' */
status = cryptGetAttributeString( certificate, CRYPT_CERTINFO_NEXTUPDATE,
&timeStamp, &length );
if( cryptStatusOK( status ) )
{
strcpy( nuBuffer, ctime( &timeStamp ) );
nuBuffer[ strlen( nuBuffer ) - 1 ] = '\0'; /* Stomp '\n' */
}
if( certType == CRYPT_CERTTYPE_OCSP_RESPONSE )
{
if( cryptStatusOK( status ) )
printf( "OCSP source CRL time %s,\n next update %s.\n", tuBuffer,
nuBuffer );
else
printf( "OCSP source CRL time %s.\n", tuBuffer );
}
else
{
if( cryptStatusOK( status ) )
printf( "CRL time %s,\n next update %s.\n", tuBuffer, nuBuffer );
else
printf( "CRL time %s.\n", tuBuffer );
}
/* Count and display the entries */
if( cryptSetAttribute( certificate, CRYPT_CERTINFO_CURRENT_CERTIFICATE,
CRYPT_CURSOR_FIRST ) == CRYPT_OK )
{
puts( "Revocation list information: " );
do
{
int revStatus;
noEntries++;
if( certType == CRYPT_CERTTYPE_OCSP_RESPONSE )
{
CHK( cryptGetAttribute( certificate,
CRYPT_CERTINFO_REVOCATIONSTATUS, &revStatus ) );
}
if( certType == CRYPT_CERTTYPE_CRL || \
revStatus == CRYPT_OCSPSTATUS_REVOKED )
{
CHK( cryptGetAttributeString( certificate,
CRYPT_CERTINFO_REVOCATIONDATE, &timeStamp,
&length ) );
strcpy( tuBuffer, ctime( &timeStamp ) );
tuBuffer[ strlen( tuBuffer ) - 1 ] = '\0'; /* Stomp '\n' */
}
else
strcpy( tuBuffer, "<None>" );
if( noEntries < 20 )
{
if( certType == CRYPT_CERTTYPE_OCSP_RESPONSE )
printf( " Entry %d, rev.status %d, rev.time %s.\n",
noEntries, revStatus , tuBuffer );
else
printf( " Entry %d, revocation time %s.\n", noEntries,
tuBuffer );
}
else
if( noEntries == 50 )
puts( " (Further entries exist, but won't be printed)." );
}
while( cryptSetAttribute( certificate,
CRYPT_CERTINFO_CURRENT_CERTIFICATE,
CRYPT_CURSOR_NEXT ) == CRYPT_OK );
}
printf( "Revocation list has %d entr%s.\n", noEntries,
( noEntries == 1 ) ? "y" : "ies" );
}
/* Display the self-signed status and fingerprint */
if( cryptStatusOK( cryptGetAttribute( certificate,
CRYPT_CERTINFO_SELFSIGNED, &value ) ) )
printf( "Certificate object is %sself-signed.\n",
value ? "" : "not " );
if( certType == CRYPT_CERTTYPE_CERTIFICATE || \
certType == CRYPT_CERTTYPE_CERTCHAIN )
{
CHK( cryptGetAttributeString( certificate, CRYPT_CERTINFO_FINGERPRINT,
buffer, &length ) );
printf( "Certificate fingerprint = " );
printHex( buffer, length );
}
/* List the attribute types */
puts( "Certificate extension/attribute types present (by cryptlib ID) "
"are:" );
if( cryptSetAttribute( certificate, CRYPT_CERTINFO_CURRENT_EXTENSION,
CRYPT_CURSOR_FIRST ) == CRYPT_OK )
do
{
hasExtensions = TRUE;
cryptGetAttribute( certificate, CRYPT_CERTINFO_CURRENT_EXTENSION,
&value );
printf( " Extension type = %d.\n", value );
}
while( cryptSetAttribute( certificate, CRYPT_CERTINFO_CURRENT_EXTENSION,
CRYPT_CURSOR_NEXT ) == CRYPT_OK );
/* Display common attributes */
if( !hasExtensions )
{
puts( " (No extensions/attributes)." );
return( TRUE );
}
puts( "Some of the common extensions/attributes are:" );
if( certType == CRYPT_CERTTYPE_CRL )
{
time_t theTime;
CHK( cryptSetAttribute( certificate, CRYPT_CERTINFO_CURRENT_EXTENSION,
CRYPT_CURSOR_FIRST ) );
status = cryptGetAttribute( certificate, CRYPT_CERTINFO_CRLNUMBER,
&value );
if( cryptStatusOK( status ) && value )
printf( " crlNumber = %d.\n", value );
status = cryptGetAttribute( certificate, CRYPT_CERTINFO_DELTACRLINDICATOR,
&value );
if( cryptStatusOK( status ) && value )
printf( " deltaCRLIndicator = %d.\n", value );
status = cryptGetAttribute( certificate, CRYPT_CERTINFO_CRLREASON,
&value );
if( cryptStatusOK( status ) && value )
printf( " crlReason = %d.\n", value );
status = cryptGetAttributeString( certificate,
CRYPT_CERTINFO_INVALIDITYDATE, &theTime, &length );
if( cryptStatusOK( status ) )
printf( " invalidityDate = %s", ctime( &theTime ) );
status = cryptGetAttribute( certificate,
CRYPT_CERTINFO_ISSUINGDISTRIBUTIONPOINT, &value );
if( cryptStatusOK( status ) && value && \
cryptSetAttribute( certificate, CRYPT_CERTINFO_ISSUINGDIST_FULLNAME,
CRYPT_UNUSED ) == CRYPT_OK )
{
puts( " issuingDistributionPoint is:" );
printDN( certificate );
printAltName( certificate );
}
return( TRUE );
}
if( certType == CRYPT_CERTTYPE_CMS_ATTRIBUTES )
{
time_t signingTime;
status = cryptGetAttributeString( certificate,
CRYPT_CERTINFO_CMS_SIGNINGTIME,
&signingTime, &length );
if( cryptStatusOK( status ) )
printf( "Signing time %s", ctime( &signingTime ) );
return( TRUE );
}
if( certType == CRYPT_CERTTYPE_PKIUSER )
{
CHK( cryptGetAttributeString( certificate, CRYPT_CERTINFO_PKIUSER_ID,
buffer, &length ) );
buffer[ length ] ='\0';
printf( " PKI user ID = %s.\n", buffer );
CHK( cryptGetAttributeString( certificate,
CRYPT_CERTINFO_PKIUSER_ISSUEPASSWORD,
buffer, &length ) );
buffer[ length ] ='\0';
printf( " PKI user issue password = %s.\n", buffer );
CHK( cryptGetAttributeString( certificate,
CRYPT_CERTINFO_PKIUSER_REVPASSWORD,
buffer, &length ) );
buffer[ length ] ='\0';
printf( " PKI user revocation password = %s.\n", buffer );
return( TRUE );
}
status = cryptGetAttribute( certificate,
CRYPT_CERTINFO_KEYUSAGE, &value );
if( cryptStatusOK( status ) && value )
printf( " keyUsage = %02X.\n", value );
status = cryptGetAttribute( certificate,
CRYPT_CERTINFO_EXTKEYUSAGE, &value );
if( cryptStatusOK( status ) && value )
{
BOOLEAN firstTime = TRUE;
printf( " extKeyUsage types = " );
CHK( cryptSetAttribute( certificate, CRYPT_CERTINFO_CURRENT_EXTENSION,
CRYPT_CERTINFO_EXTKEYUSAGE ) );
do
{
CHK( cryptGetAttribute( certificate, CRYPT_CERTINFO_CURRENT_FIELD,
&value ) );
printf( "%s%d", firstTime ? "" : ", ", value );
firstTime = FALSE;
}
while( cryptSetAttribute( certificate, CRYPT_CERTINFO_CURRENT_FIELD,
CRYPT_CURSOR_NEXT ) == CRYPT_OK );
printf( ".\n" );
}
status = cryptGetAttribute( certificate, CRYPT_CERTINFO_CA, &value );
if( cryptStatusOK( status ) && value )
printf( " basicConstraints.cA = %s.\n", value ? "True" : "False" );
status = cryptGetAttribute( certificate, CRYPT_CERTINFO_PATHLENCONSTRAINT,
&value );
if( cryptStatusOK( status ) && value )
printf( " basicConstraints.pathLenConstraint = %d.\n", value );
status = cryptGetAttributeString( certificate,
CRYPT_CERTINFO_SUBJECTKEYIDENTIFIER, buffer, &length );
if( cryptStatusOK( status ) )
{
printf( " subjectKeyIdentifier = " );
printHex( buffer, length );
}
status = cryptGetAttributeString( certificate,
CRYPT_CERTINFO_AUTHORITY_KEYIDENTIFIER, buffer, &length );
if( cryptStatusOK( status ) )
{
printf( " authorityKeyIdentifier = " );
printHex( buffer, length );
}
status = cryptGetAttributeString( certificate,
CRYPT_CERTINFO_CERTPOLICYID, buffer, &length );
if( cryptStatusOK( status ) )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -