Aggiungere firme digitali alle presentazioni in Python
Panoramica
Una firma digitale aiuta il destinatario a determinare chi ha firmato una presentazione e se il contenuto firmato è cambiato. Tre concetti di sicurezza correlati sono importanti qui:
- Un certificato digitale è una credenziale elettronica che associa un’identità a una chiave pubblica. Un’autorità di certificazione (CA) attendibile può rilasciare un certificato, o un’organizzazione può usare un certificato autofirmato per flussi di lavoro interni.
- Una firma digitale è creata dal contenuto della presentazione e dalla chiave privata del titolare del certificato. La chiave pubblica del certificato può quindi essere usata per verificare la firma. Una firma fornisce prova di origine e integrità; non crittografa la presentazione.
- La protezione con password controlla se un utente può aprire o modificare una presentazione. È separata dalla firma digitale ed è descritta in Presentazioni protette da password.
PowerPoint fornisce il comando Aggiungi una firma digitale sotto File > Info > Proteggi presentazione.

Dopo l’apertura di una presentazione firmata, PowerPoint può visualizzare una notifica sullo stato della firma.

Aspose.Slides espone le firme attraverso Presentation.getDigitalSignatures, che restituisce una DigitalSignatureCollection i cui elementi sono istanze di DigitalSignature. Una presentazione può contenere più firme.
Comprendere i certificati PFX e le password
Un file PFX, noto anche come file PKCS#12 e comunemente con estensione .pfx o .p12, può contenere un certificato X.509, la sua chiave privata e la catena dei certificati. La chiave privata è ciò che permette al titolare di creare una firma. Un certificato senza una chiave privata accessibile non può essere usato per firmare una presentazione.
La password PFX protegge il pacchetto del certificato e la chiave privata. Non è una password per aprire o modificare la presentazione. Non eseguire il commit di file PFX o delle loro password nel controllo del codice sorgente. In produzione, limita l’accesso al file del certificato e ottieni la password da un archivio segreto o da un’altra fonte di configurazione protetta. Gli esempi seguenti usano una variabile d’ambiente solo per evitare di incorporare la password nel codice.
Aggiungere una firma digitale a una presentazione
Per firmare un flusso di lavoro reale, carica un file PPTX esistente, crea una DigitalSignature da un certificato PFX e dalla sua password, aggiungi la firma alla collezione della presentazione e salva in un file PPTX.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
import os
from asposeslides.api import Presentation, DigitalSignature, SaveFormat
certificate_password = os.environ.get("PFX_PASSWORD")
if not certificate_password:
print("Set the PFX_PASSWORD environment variable.")
else:
presentation = Presentation("InputPresentation.pptx")
try:
signature = DigitalSignature("signing-certificate.pfx", certificate_password)
signature.setComments("Approved for release.")
presentation.getDigitalSignatures().add(signature)
presentation.save("InputPresentation-signed.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Salvare il risultato con un nuovo nome preserva il file sorgente non firmato. Il valore impostato tramite DigitalSignature.setComments descrive lo scopo della firma; non è un controllo di sicurezza.
Convalidare le firme digitali
Quando carichi un file PPTX firmato, ispeziona ogni elemento restituito da Presentation.getDigitalSignatures. Il metodo DigitalSignature.isValid indica se la firma incorporata è valida per il contenuto attuale della presentazione.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation
ByteArrayInputStream = jpype.JClass("java.io.ByteArrayInputStream")
CertificateFactory = jpype.JClass("java.security.cert.CertificateFactory")
SimpleDateFormat = jpype.JClass("java.text.SimpleDateFormat")
presentation = Presentation("InputPresentation-signed.pptx")
try:
signatures = presentation.getDigitalSignatures()
signature_count = signatures.size()
if signature_count == 0:
print("The presentation does not contain digital signatures.")
else:
all_signatures_are_valid = True
sign_time_format = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
certificate_factory = CertificateFactory.getInstance("X.509")
for signature in signatures:
signature_is_valid = signature.isValid()
signature_status = "VALID" if signature_is_valid else "INVALID"
sign_time = signature.getSignTime()
formatted_sign_time = sign_time_format.format(sign_time)
certificate_data = signature.getCertificate()
certificate_stream = ByteArrayInputStream(certificate_data)
certificate = certificate_factory.generateCertificate(certificate_stream)
signer_principal = certificate.getSubjectX500Principal()
signer_name = signer_principal.getName()
print(f"{signer_name}, {formatted_sign_time} -- {signature_status}")
all_signatures_are_valid = all_signatures_are_valid and signature_is_valid
if all_signatures_are_valid:
print("All embedded signatures are valid for the current presentation.")
else:
print("At least one embedded signature is invalid.")
finally:
presentation.dispose()
Un risultato non valido indica comunemente che il contenuto firmato della presentazione o i dati della firma sono stati modificati dopo la firma, oppure che il file è danneggiato. Rimuovere ogni firma produce una presentazione non firmata, quindi verificare solo la validità degli elementi non è sufficiente: un flusso di lavoro sensibile alla sicurezza deve anche verificare che il numero previsto di firme e le identità dei firmatari attesi siano presenti.
Questo risultato di validità non deve essere trattato come una decisione completa di fiducia nel certificato. A seconda della tua politica di sicurezza, la tua applicazione potrebbe anche dover costruire e convalidare la catena di certificati X.509, controllare le date di validità del certificato e lo stato di revoca, confermare il soggetto o l’impronta attesi, verificare l’uso della chiave e valutare un timestamp attendibile. Il valore restituito da DigitalSignature.getSignTime da solo non è una prova da un’autorità di timestamp attendibile.
Rimuovere le firme digitali
Rimuovere le firme cambia lo stato di sicurezza della presentazione. L’esempio seguente carica un file PPTX firmato, rimuove tutte le firme con DigitalSignatureCollection.clear e salva una copia non firmata.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat
presentation = Presentation("InputPresentation-signed.pptx")
try:
presentation.getDigitalSignatures().clear()
presentation.save("InputPresentation-unsigned.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Per rimuovere una sola firma, chiama DigitalSignatureCollection.removeAt con il suo indice zero‑based. Salva in un nuovo file a meno che la sovrascrittura dell’originale firmato non sia una parte esplicita del tuo flusso di lavoro.
Considerazioni su editing e formati
- Una firma non rende una presentazione di sola lettura. Utenti e applicazioni possono ancora modificare il file, ma le modifiche al contenuto firmato normalmente invalidano la firma esistente.
- Completa tutte le modifiche previste prima di firmare. Se una presentazione deve essere cambiata, salva la versione rivista e firma nuovamente quella revisione.
- Mantieni l’output finale in formato PPTX. Convertire una presentazione firmata in un altro formato non trasferisce la firma PPTX originale come firma valida per il file convertito.
- Tratta la chiave privata del certificato come sensibile. Chiunque ottenga la chiave privata e la sua password può creare firme che sembrano provenire dal titolare del certificato.
- Conserva il sorgente non firmato o un’altra copia controllata quando la tua politica di conservazione dei documenti lo richiede.
FAQ
Una firma digitale cripta la presentazione?
No. Una firma digitale fornisce prova di origine e integrità, ma il contenuto della presentazione rimane leggibile a meno che non venga applicata una crittografia separata. Usa protezione con password quando l’accesso al contenuto deve essere limitato.
La password PFX è la stessa della password della presentazione?
No. La password PFX sblocca la chiave privata memorizzata nel pacchetto del certificato. Non controlla chi può aprire o modificare il file PPTX.
Posso usare un certificato autofirmato?
Tecnicamente, un certificato autofirmato può essere usato quando include una chiave privata accessibile. I destinatari non lo considereranno automaticamente attendibile, a meno che il certificato non sia stato aggiunto esplicitamente al loro ambiente fidato. I flussi di lavoro pubblici o inter‑organizzativi generalmente usano un certificato emesso da una CA attendibile.
Cosa rende una firma non valida?
Modificare il contenuto della presentazione firmata o i dati della firma dopo la firma può invalidare la firma. La corruzione del file può anche causare il fallimento della convalida. Se tutte le firme vengono rimosse, la presentazione è non firmata anziché contenere una firma non valida.
Una firma valida implica che devo fidarmi del firmatario?
Non da sola. L’integrità della firma e la fiducia nel firmatario sono decisioni separate. Una politica di convalida in produzione dovrebbe anche verificare la catena del certificato, il periodo di validità, lo stato di revoca, l’identità prevista, l’uso della chiave e eventuali requisiti di timestamp attendibile.
Cosa succede quando il certificato scade?
La scadenza del certificato non altera i byte della presentazione, ma influisce sulla valutazione della fiducia del certificato. Se una firma rimane accettabile dipende dalla tua politica e dal fatto che un timestamp attendibile provi che la firma è stata effettuata mentre il certificato era valido. Non fare affidamento solo sul tempo di firma visualizzato come timestamp attendibile.
Una presentazione firmata può ancora essere modificata?
Sì. La firma non blocca il file. Modificare il contenuto firmato generalmente rende la firma esistente non valida, quindi termina la presentazione prima e firma la revisione finale.
Una presentazione può contenere più di una firma?
Sì. Aggiungi ogni firma alla collezione restituita da Presentation.getDigitalSignatures prima di salvare. Durante la convalida, ispeziona ogni firma e conferma che tutti i firmatari richiesti siano presenti.
Quali formati di presentazione supportano queste operazioni?
Aspose.Slides supporta le operazioni di firma digitale descritte qui solo per PPTX. I formati PPT e OpenDocument non sono supportati da questo flusso di lavoro API.
Posso rimuovere una firma senza influire sulle diapositive?
Sì. Puoi rimuovere una firma o svuotare l’intera collezione e poi salvare la presentazione. Il contenuto delle diapositive rimane disponibile, ma il file salvato non contiene più le evidenze della firma rimossa.