Skip to main content

Authenticate with CSC

Authenticate the client with CSC before signing content to ensure that only authorized users can sign documents or manifests.

Required inputs

  • Client certificate (cert.pem) – Identifies the client. 

  • Private key (key.pem) – Private key for the certificate.

  • PIN – Secret PIN associated with your CSC credential.

Process

CSC validates the certificate and private key, then checks the PIN. Signing is allowed only after successful validation.

Outputs

  • creds_info – Dictionary containing raw credential details returned by CSC.

  • author_name – Name extracted from the certificate (Common Name / CN).

  • author_email – Email returned by CSC (This might remain empty in demo environment).

Python example

#This Python script authenticates the user with CSC demo API using a client certificate, #...private key, and PIN, and returns raw credential information along with the author #...name extracted from the certificate and the author email (if available). 

import base64  
import json  
import requests  
import logging  
from cryptography 
import x509  
from cryptography.x509.oid 
import NameOID  
import getpass  

# Configure logging  logging.basicConfig(level=logging.INFO)    
# CSC demo endpoint and certificate/key files  
CSC_BASE_URL = "https://clientauth.demo.one.digicert.com/documentmanager/csc/v1"  
CLIENT_CERT = "cert.pem"  CLIENT_KEY = "key.pem"  
CREDENTIAL_ID = "basic_np-14-08-2025-11-01-44-165" # Replace with your credential ID  

def extract_author_from_cert(cert_b64: str) -> str | None:      
"""      
Extracts the Common Name (CN) from a base64 DER certificate string.      
"""      
try:          
cert_der = base64.b64decode(cert_b64)          
cert = x509.load_der_x509_certificate(cert_der)          
cn_attr = cert.subject.get_attributes_for_oid(NameOID.COMMON_NAME)          
if cn_attr:              
return cn_attr[0].value      
except Exception as e:          
logging.error("Failed to extract CN from certificate", exc_info=e)      
return None  

def get_credentials_info(pin: str):      
"""      
Authenticate with CSC using certificate, key, and PIN.      
Returns raw credentals, author name, and author email (if any).      
"""      
try:          
logging.info("📡 Requesting credentials info from CSC...")          
payload = {"PIN": pin, "credentialID": CREDENTIAL_ID}          
url = f"{CSC_BASE_URL}/credentials/info"          
resp = requests.post(              
url,              
json=payload,              
cert=(CLIENT_CERT, CLIENT_KEY),              
headers={"Content-Type": "application/json"},              
timeout=10          
)          
resp.raise_for_status()          
data = resp.json() 

# Extract author name from certificate CN          
certs = data.get("cert", {}).get("certificates", [])          
author_name = extract_author_from_cert(certs[0]) if certs else None          
author_email = ""  # Demo API usually returns empty            
logging.info("✅ Authentication successful!")          
return data, author_name, author_email        

except Exception as e:          
logging.error("❌ Authentication failed", exc_info=e)          
return {}, None, ""  
  
if __name__ == "__main__":      
pin = getpass.getpass("Enter your credential PIN: ").strip()      
creds_info, author_name, author_email = get_credentials_info(pin)        

print("\nRaw credential info (creds_info):")      
print(json.dumps(creds_info, indent=4))      
print(f"\nAuthor Name (from certificate CN): {author_name}")      
print(f"Author Email (from API, usually empty in demo): {author_email}")