Я разрабатываю веб-приложение, и для него требуется PDF-документ, который должен быть подписан цифровой подписью с помощью устройства cryptographi c. Характеристики устройства указаны по следующей ссылке:
https://csrc.nist.gov/Projects/cryptographic-module-validation-program/Certificate/2825
Используемый язык программирования Python (Django). Я искал информацию на некоторых форумах и в научных c статьях. И большинство согласны с тем, что наиболее элегантным решением является использование расширения браузера. Я понимаю, что процесс подписания должен быть разработан на стороне клиента, точнее с использованием Javascript. Я хотел бы знать, есть ли какое-нибудь решение с открытым исходным кодом, которое может помочь мне.
models.py
class Documento(models.Model):
area = models.ForeignKey(Area, on_delete=models.CASCADE, null=True, related_name="documentos")
tipo_documento = models.ForeignKey(TipoDocumento, on_delete=models.CASCADE, null=True, related_name="tipo_documentos")
naturaleza = models.ForeignKey(Naturaleza, on_delete=models.CASCADE, null=True, related_name="naturaleza_documentos")
autor = models.ForeignKey(Funcionario, on_delete=models.CASCADE, related_name="autor_documentos")
archivo_pdf = models.FileField('Subir Archivo PDF', upload_to='documentos/', validators=[validate_file, FileExtensionValidator(['pdf'])])
nombre_documento = models.CharField('Nombre del Documento', max_length=200)
numero_documento = models.CharField('Numeración del Documento', max_length=200, null=True, blank=True)
fecha = models.DateTimeField('Fecha de Subida', default=timezone.now)
firmado = models.BooleanField(default=False)
estado = models.BooleanField(default=True)
def __str__(self):
return self.nombre_documento
def save(self):
self.nombre_documento = self.nombre_documento.upper()
self.numero_documento = self.numero_documento.upper()
if not self.fecha:
self.fecha = datetime.datetime.now()
super(Documento, self).save()
def delete(self, *args, **kwargs):
self.archivo_pdf.delete()
super().delete(*args, **kwargs)
class Firma(models.Model):
documento = models.ForeignKey(Documento, on_delete=models.CASCADE, related_name="documentos_firmas")
funcionario = models.ForeignKey(Funcionario, on_delete=models.SET_NULL, null=True, blank=True, related_name="funcionarios_firmas")
fecha_firma = models.DateTimeField(default=timezone.now)
def save(self, *args, **kwargs):
if not self.fecha_firma:
self.fecha_firma = datetime.datetime.now()
super(Firma, self).save(*args, **kwargs)