Moduł Module::Signature
Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowaSpis treści
Co to jest?
- Składnia
Moduł do manipulacji plikami z podpisami.
Jako komenda w shell'u:
% cpansign # weryfikuje istniejący podpis, lub
# tworzy nowy jeśli jeśli żaden nie istnieje
% cpansign sign # tworzy podpis; nadpisuje istniejący
% cpansign -s # to samo
% cpansign verify # weryfikuje podpis
% cpansign -v # to samo
% cpansign -v --skip # ignoruje pliki w MANIFEST.SKIP
% cpansign help # wyświetla ten dokument
% cpansign -h # to samo
W progamie:
use Module::Signature qw(sign verify SIGNATURE_OK);
sign();
sign(overwrite => 1); # Nadpisuje bez pytania
# Spójrz na sekcje o stałych niżej
(verify() == SIGNATURE_OK) or die "failed!";
Module::Signature dodaje kryptograficzne poświadczenie do dystrybucji CPAN, poprzez specjalny plik z podpisem.
Podpis cyfrowy (podpis elektroniczny) to dodatkowa informacja dołączona do wiadomości (w naszym przypadku modułowi) służąca do weryfikacji jej źródła. Dzięki podpisowi dowolny użytkownik który sciągną określony moduł jeśli został on wcześniej podpisany jest w stanie sprawdzić czy nikt niepowołany nie wprowadzał w nim zmian. Jest przydatne w przypadkach udostępniania swoich dystrybucji jako ogólno dostępne. Dlatego też moduł ten jest przydatny raczej fachowcom którzy piszą własne moduły później udostępniane ogółowi (np. poprzez cpan).
Jeśli jesteś użytkownikiem modułu, wszystko co musisz zrobić to pamiętać o uruchomieniu cpansing -v (lub tylkocpansign) zanim użyjesz perl Makefile.PL, bądź Build.PL; który upewni się że w dystrybucja nie grzebano.
Autorzy modułu łatwo mogą dodać plik z podpisem do dystrybucji; Zobacz sekcje notatki poniżej aby dowiedzieć się zrobić to jako część make dist.
Jeśli rzeczywiście chcesz podpisać dystrybucje ręcznie, zwyczajnie dodaj podpis do MAINFEST, wtedy napisz cpansign -s zaraz po stworzeniu dystrybucji. Upewnij się aby później skasować plik z podpisem.
Proszę również zobaczyć sekcje Notatki oraz wątki o o dokumentacji, w szczególności jeśli używasz modułu Module::Build do tworzenia swojego własnego MANIFEST.SKIP.
Zmienne
- $Verbose
Jeśli ustawione na prawda, Module::Signature wyświetli informacje w trakcie przetwarzania włączając wyjście gpg. Jeśli ustawione na fałsz, Module::Signature będzie tak cichy jak to tylko możliwe, jak długo tylko wszystko będzie działało bez zarzutu. Domyślnie fałsz.
- $SIGNATURE
Nazwa pliku dla pliku z podpisem dystrybucji.. Domyślnie SIGNATURE.
- $KeyServer
Serwer z którego może zostać pobrany klucz publiczny OpenPGP autora (obecnie zaimplementowane jedynie gpg, nie Crypt::OpenPGP). Może zostać ustawione na fałsz aby zapobiec pobieranie klucza publicznego przez moduł.
- $KeyServerPort
- Port do serwera z kluczem OpenGPG, domyślnie 11371.
- $Timeout
Maksymalny czas oczekiwania w którym powinno zostać ustanowione połączenie z serwerem z kluczami. Domyślnie 3.
- $AutoKeyRetrieve
Czy automatycznie ściągać nieznane klucze z serwera z kluczami. Domyślnie 1.
- $Cipher
Domyślny szyfr użyty przez moduł Digest do tworzenia pliku z podpisem. Domyślnie SHA1, ale może zostać zmieniony na inny szyfr poprzez zmienna środowiskową MODULE_SIGNATURE_CIPHER jeśli SHA1 szyfr nie jest pożądany.
Szyfr określony w pliku SIGNATURE będzie użyty do pierwszego wpisu aby zatwierdzić poprawność. Dla SHA1, użytkownik potrzebuje zainstalowany którykolwiek z tych modułów: Digest::SHA, Digest::SHA1, Digest::SHA::PurePerl, albo (obecnie nie istnieje) Digest::SHA1::PurePerl.
- $preamble
Tekst wyjaśniający umieszczony na nowo wygenerowanych plikach z podpisem przed rzeczywistym wpisem.
Zmienne które pozwolą nam kontrolować przebieg podpisywania bądź też sprawdzania podpisu. Domyślnie żadne zmienne z pakietu nie są eksportowane.
Środowisko
- MODULE_SIGNATURE_CIPHER
Działa tak samo jak $Cipher
- MODULE_SIGNATURE_VERBOSE
Działa tak samo jak $Verbose
- MODULE_SIGNATURE_KEYSERVER
Działa tak samo jak $KeyServer
- MODULE_SIGNATURE_KEYSERVERPORT
Działa tak samo jak $KeyServerPort
- MODULE_SIGNATURE_TIMEOUT
Działa tak samo jak $Timeout
Zmienne środowiskowe pozwolą nam kontrolować przebieg procesu weryfikacji bez potrzeby podawania ich bezpośrednio do metod. Może okazać się to przydatne w momencie gdy będziemy musieli wytworzyć wiele podpisów (chyba nie częsta sytuacja). Moduł Module::Signature honoruje następujące zmienne środowiskowe:
Stałe
- CANNOT_VERIFY (0E0)
Nie można zweryfikować podpisu OpenPGP, może poprzez brak połącznia do sieci, albo zarówno gnupg bądź Crypt::OpenPGP nie istnieje w systemie.
- SIGNATURE_OK (0)
Podpis pomyślnie sprawdzony.
- SIGNATURE_MISSING (-1)
Plik z podpisem nie istnieje.
- SIGNATURE_MALFORMED (-2)
Podpis nie zawiera poprawnej wiadomości OpenPGP.
- SIGNATURE_BAD (-3)
Znaleziono niepoprawny podpis -- coś mogło zostać zmienione.
- SIGNATURE_MISMATCH (-4)
Podpis jest poprawny, ale pliki w dystrybucji zmienił sie od momentu jego stworzenia.
- MANIFEST_MISMATCH (-5)
Istnieją dodatkowe pliki w bieżącym katalogu nie uwzględnione w pliku MANIFEST.
- CIPHER_UNKNOWN (-6)
- Szyfr użyty do podpisu nie jest rozpoznawalny przez moduły Digest::*.
Stałe które pozwolą nam sprawdzić jaki wynik dało testowanie podpisu. Dzięki tym stałym nasz kod stanie się bardziej czytelny. Te stałe nie są eksportowane domyślnie.
Dodatkowe informacje.
-
Najprostszym sposobem jest użycie Module::Install:
sign; # umieść to przed "WriteAll" WriteAll;
Dla ExtUtils::MakeMaker możesz użyć:
WriteMakefile( (MM->can('signature_target') ? (SIGN => 1) : ()), # ... pierwotne argumenty ... );
Użytkownicy modułu Module::Build mogą zrobić tak:
Module::Build->new( (sign => 1), # ... pierwotne argumenty ... )->create_build_script;
- Testowanie podpisów.
-
Możesz dodać ten kod jako t/0-signature.t w drzewie swojej dystrybucji:
#!/usr/bin/perl use strict; print "1..1\n"; if (!$ENV{TEST_SIGNATURE}) { print "ok 1 # skip Set the environment variable", " TEST_SIGNATURE to enable this test\n"; } elsif (!-s 'SIGNATURE') { print "ok 1 # skip No signature file found\n"; } elsif (!eval { require Module::Signature; 1 }) { print "ok 1 # skip ", "Next time around, consider install Module::Signature, ", "so you can verify the integrity of this distribution.\n"; } elsif (!eval { require Socket; Socket::inet_aton('pgp.mit.edu') }) { print "ok 1 # skip ", "Cannot connect to the keyserver\n"; } else { (Module::Signature::verify() == Module::Signature::SIGNATURE_OK()) or print "not "; print "ok 1 # Valid signature\n"; } __END__
- Przykładowe użycie
-
Przedstawiam poniżej przykład następujących czynności: stworzenie nowego (nadpisanie starego), sprawdzenie podpisu. Wszystkie czynności zostały wykonane na naszym module. Aby miało to sens należało by udostępnić klucz publiczny w moim przykładzie jednak nie jest to konieczne ponieważ posiadam własny klucz publiczy :).
- Przydatne linki
Kontakt i informacje o autorze opracowania
Autor modułu:
Audrey Tang
Autor przekładu: MD
Numer GG: 2194164