From e136e7cbbfa9d4d763e1557782687488dd078921 Mon Sep 17 00:00:00 2001 From: Thomas Hooge Date: Mon, 5 Dec 2016 19:21:56 +0100 Subject: [PATCH] Imported former upstream version 0.7.5 --- CHANGES | 212 +++ INSTALL | 30 + install.sh | 9 + lib/CA.pm | 1402 ++++++++++++++++++ lib/CERT.pm | 713 +++++++++ lib/GUI.pm | 3105 +++++++++++++++++++++++++++++++++++++++ lib/GUI/CALLBACK.pm | 173 +++ lib/GUI/HELPERS.pm | 479 ++++++ lib/GUI/TCONFIG.pm | 1502 +++++++++++++++++++ lib/GUI/WORDS.pm | 112 ++ lib/GUI/X509_browser.pm | 879 +++++++++++ lib/GUI/X509_infobox.pm | 280 ++++ lib/HELPERS.pm | 393 +++++ lib/KEY.pm | 494 +++++++ lib/OpenSSL.pm | 1079 ++++++++++++++ lib/REQ.pm | 777 ++++++++++ lib/TCONFIG.pm | 555 +++++++ po/Makefile | 25 + po/cs.po | 2003 +++++++++++++++++++++++++ po/de.po | 1980 +++++++++++++++++++++++++ po/es.po | 2010 +++++++++++++++++++++++++ po/fr.po | 1999 +++++++++++++++++++++++++ po/sv.po | 2158 +++++++++++++++++++++++++++ po/tinyca2.pot | 1918 ++++++++++++++++++++++++ templates/openssl.cnf | 147 ++ tinyca2 | 115 ++ tinyca2.desktop | 38 + tinyca2.spec | 170 +++ 28 files changed, 24757 insertions(+) create mode 100644 CHANGES create mode 100644 INSTALL create mode 100755 install.sh create mode 100644 lib/CA.pm create mode 100644 lib/CERT.pm create mode 100644 lib/GUI.pm create mode 100644 lib/GUI/CALLBACK.pm create mode 100644 lib/GUI/HELPERS.pm create mode 100644 lib/GUI/TCONFIG.pm create mode 100644 lib/GUI/WORDS.pm create mode 100644 lib/GUI/X509_browser.pm create mode 100644 lib/GUI/X509_infobox.pm create mode 100644 lib/HELPERS.pm create mode 100644 lib/KEY.pm create mode 100644 lib/OpenSSL.pm create mode 100644 lib/REQ.pm create mode 100644 lib/TCONFIG.pm create mode 100644 po/Makefile create mode 100644 po/cs.po create mode 100644 po/de.po create mode 100644 po/es.po create mode 100644 po/fr.po create mode 100644 po/sv.po create mode 100644 po/tinyca2.pot create mode 100644 templates/openssl.cnf create mode 100755 tinyca2 create mode 100644 tinyca2.desktop create mode 100644 tinyca2.spec diff --git a/CHANGES b/CHANGES new file mode 100644 index 0000000..1d5f8a2 --- /dev/null +++ b/CHANGES @@ -0,0 +1,212 @@ +$Id: CHANGES,v 1.23 2006/07/25 20:10:54 sm Exp $ + +version 0.7.5 - Tue July 25 2006 + * added swedish translation + many thanks to Daniel Nylander + +version 0.7.4 - Thu June 29 2006 + * fixed invalid filename encoding with german umlauts in base64 + thanks to Bruno Blumenthal + * Fixed display of UTF8 characters in the GUI + Debian #367829 + +version 0.7.3 - Tue May 23 2006 + * Add environment variable + Gentoo #78576 + thanks to dragonheart at gentoo dot org + * Fixed crash when CA is created with nsCertType + Debian #354386 + +version 0.7.3 - Tue May 23 2006 + * Enhanced version detection + thanks to Peter Marschall + Debian #360766 #360555 + * Changed command for openssl due to changed openssl behavior + regarding fingerprints + thanks to Peter Marschall + Debian #360768 + * Added "friendly name" to PKCS#12 export + Debian #364617 + * Corrected exit call + thanks to Peter Marschall + Debian #360767 + + +version 0.7.2 - Sat Feb 18 2006 + * Fixed bug, which made keysize always 4096 + * Implemented correct usage of openssl crl depending on openssl version + * Added tar file support for export + +version 0.7.1 - Sat Oct 22 2005 + * Fixed possible crashbug, thanks to + * Choose CA validity as maximal certificate lifetime + * correctly include/don't include keys in exported certificate files + thanks to "thus0 at free dot fr" + * added ripemd160 support, thanks to Wim Lewis + * added possibility to create pkcs#12 without password + * fixed broken OU in SubCA, thanks to Charles Lepple + * fixed bug which made saving options with comboboxes impossible + thanks to "thus0 at free dot fr" + * fixed bug inseting the right serial number during import + thanks to Daniel Kahn Gillmor + +version 0.7.0 - Sun Apr 10 2005 + * migrated to perl-Gtk2 + * added advanced export options (Debian #293931) + * added CA history + * fixed some minor bugs + +version 0.6.8 (beta) - Sun Feb 20 2004 + * added detection for openssl 0.9.8 + * removed crlDistributionPoint for Root-CA + * added patch for multiple OUs + Thanks to Uwe Arndt + * added patch for multiple subjectAltName extensions (Debian #271183) + Thanks to Peter Marschall + +version 0.6.7 (beta) - Mon Dec 5 2004 + * added import functionality + +version 0.6.6 (beta) - Fri Aug 13 2004 + * added czech translation + Thanks to Robert Wolf + +version 0.6.5 (beta) - Thu Aug 05 2004 + * added spanish translation + Thanks to Ramon Pons Vivanco + * force (re)parsing a newly created request + * force delete of internal structures, when deleting a CA + +version 0.6.4 (beta) - Thu Jul 15 2004 + * fixed bug, showing wrong options for renewal of certificates + * fixed bug creating requests via rightclick directly after creating a new CA + (thanks to wbx@openbsd.de) + * fixed bug which added ugly empty box to cert/req page + * fixed bug with wrong openssl.conf during startup (server-cert with + ca-extensions) + (thanks to bernhard.dawuidow@tronicplanet.de) + * fixed ca-config dialog during creation of root-ca (drop-downs) + (thanks to X_KurJ@viessmann.com) + * revocation reason can be given with openssl 0.9.7 + * changed default exportdir to users home + * remeber exportdir from last export + * added possibility to set the extension extendedKeyUsage + * added possibility to leave email out of the subject dn (0.9.7) + +version 0.6.3 (beta) - Wed Jun 16 2004 + * fixed bug which made it impossible to create new requests + +version 0.6.2 (beta) - Sun Jun 13 2004 + * added new look for some functions + * key, request and certificate can be generated in one step + * code cleanup + +version 0.6.1 (beta) - Sat May 22 2004 + * fixed bug, which made it impossible to create a new Root-CA + Thanks to Olaf Gellert + +version 0.6.0 (beta) - Tue May 11 2004 + * some minor usability improvements + * added possibility to create SubCAs now + * added possibility also to use DSA keys + * added possibility to select the digest during key creation + * added possibility to export the complete CA-chain of a SubCA + Thanks a lot to Olaf Gellert for ideas and patches. + +version 0.5.4 (beta) - Fri Oct 3 2003 + * added a lot of configuration options + * correctly import/show details of requests without extensions + (thanks to James.Leavitt@anywaregroup.com) + +version 0.5.3 (beta) - Mon Sep 29 2003 + * fixed wrong label while creating new CA + * fixed bug, saving configuration is possible again + +version 0.5.2 (beta) - Mon Sep 1 2003 + * added renewal of certificates + +version 0.5.1 (beta) - Tue Aug 26 2003 + * code cleanup + * fixed some minor bugs and typos + * corrected some window sizes and tables + * added accelerators to the menu + +version 0.5.0 (beta) - Sat Aug 16 2003 + * GUI rewriten with perl-Gtk/Gnome + +version 0.4.9 (beta) - Sat Jul 5 2003 + * added german translation + +version 0.4.8 (beta) - Tue Jul 1 2003 + * convert index.txt if openssl changed from 0.9.6x to 0.9.7x + +version 0.4.7 (beta) - Fri Jun 27 2003 + * added export into zip-file + thanks to ludwig.nussel@suse.de + +version 0.4.6 (beta) - Mon Jun 23 2003 + * some tiny usability improvements + thanks to ludwig.nussel@suse.de again + +version 0.4.5 (beta) - Thu Jun 19 2003 + * some usability improvements + thanks to ludwig.nussel@suse.de + * some more configuration options + +version 0.4.4 (beta) - Fri Oct 4 2002 + * Fixed bug exporting keys in PEM format + * Fixed possible empty lines in cert/key/reqlist + thanks to waldemar.mertke@gmx.de + +version 0.4.3 (beta) - Fri Sep 27 2002 + * Fixed some minor bugs and typos (e.g. concerning openssl 0.9.7) + thanks to iebgener@yahoo.com and waldemar.mertke@gmx.de + +version 0.4.2 (beta) - Sat Aug 24 2002 + * fixed revocation when serial is > 15 + thanks to curly@e-card.bg + * fixed recognition of java-generated requests + thanks to matthew.lewis@syntegra.com + * code cleanup + +version 0.4.1 (beta) - Wed Aug 21 2002 + * fixed revocation + * added some colors + * thanks to curly@e-card.bg + +version 0.4.0 (beta) - Sun Aug 18 2002 + * works independent of OpenCA modules now + * some enhancements to functionality (e.g. export of key without + passwd) + * some smaller bugfixes in usability + * new specfile (thanks to oron@actcom.co.il) + +version 0.3.4 (beta) - Mon Jun 3 2002 + * fixed wrong templatedir when creating a new CA + +version 0.3.3 (beta) - Sun Jun 2 2002 + * fixed some minor bugs and typos + import of requests from ssh-sentinel should work now without problems + +version 0.3.2 (beta) - Sat May 11 2002 + * added parser for x509 extensions when viewing certificate details + +version 0.3.1 (beta) - Fri May 3 2002 + * added option to view complete certificate/request as text + +version 0.3.0 (beta) - Thu Apr 18 2002 + * added possibility to configure openssl + * fixed some minor bugs + +version 0.2.5 (beta) - Sun Apr 7 2002 + * improved usabilty and errorhandling + * fixed some minor bugs and typos + +version 0.2.4 (beta) - Sun Mar 31 2002 + * added possibilty to import PKCS#10 requests + * added function to delete a configured CA + +version 0.2.3 (beta) - Tue Mar 26 2002 + * fixed bug with expiration date defaults to 30 days when creating + a new CA + * change status to E in index.txt, if certificate is expired diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..5f174e0 --- /dev/null +++ b/INSTALL @@ -0,0 +1,30 @@ +1. Unpack the sources (seems like you got it already) + +2. Configure the following paths for your setup. These variables + are located in the file tinyca itself. + +@INC (location of the directory lib) +$init->{'opensslbin'} (location of your openssl binary) +$init->{'templatedir'} (location of the directory templates) +$init->{'zipbin'} (location of your zip binary) +$init->{'tarbin'} (location of your tar binary) + +3. If you want to have german/spanish/czech/swedish texts: + Generate the file tinyca.mo from po/de.po: + msgfmt po/de.po -o locale/de/LC_MESSAGES/tinyca.mo + msgfmt po/es.po -o locale/es/LC_MESSAGES/tinyca.mo + msgfmt po/cs.po -o locale/cs/LC_MESSAGES/tinyca.mo + msgfmt po/sv.po -o locale/sv/LC_MESSAGES/tinyca.mo + or even more simple: call make in the directory po/ + + If your locale is not set to german/spanish: + export LC_ALL=de_DE.UTF-8 + or + export LC_ALL=es_ES.UTF-8 + or + export LC_ALL=cs_CZ.UTF-8 + or + export LC_ALL=sv_SE.UTF-8 + before you call tinyca. + +4. Call tinyca2, use it and report bugs :-)) diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..45c1eed --- /dev/null +++ b/install.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +mkdir -p locale/de/LC_MESSAGES +mkdir -p locale/es/LC_MESSAGES +mkdir -p locale/cs/LC_MESSAGES + +msgfmt po/de.po -o locale/de/LC_MESSAGES/tinyca2.mo +msgfmt po/es.po -o locale/es/LC_MESSAGES/tinyca2.mo +msgfmt po/cs.po -o locale/cs/LC_MESSAGES/tinyca2.mo diff --git a/lib/CA.pm b/lib/CA.pm new file mode 100644 index 0000000..7e7fba6 --- /dev/null +++ b/lib/CA.pm @@ -0,0 +1,1402 @@ +# Copyright (c) Stephan Martin +# +# $Id: CA.pm,v 1.9 2006/06/28 21:50:41 sm Exp $ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + +use strict; + +package CA; + +use POSIX; + +sub new { + my $that = shift; + my $self = {}; + + my $class = ref($that) || $that; + + $self->{'init'} = shift; + + if(not -d $self->{'init'}->{'basedir'}) { + print "create basedir: $self->{'init'}->{'basedir'}\n"; + mkdir($self->{'init'}->{'basedir'}, 0700); + } + + if(not -d $self->{'init'}->{'tmpdir'}) { + print "create temp dir: $self->{'init'}->{'tmpdir'}\n"; + mkdir($self->{'init'}->{'tmpdir'}, 0700); + } + + opendir(DIR, $self->{'init'}->{'basedir'}) || do { + print _("error: can't open basedir: ").$!; + exit(1); + }; + + $self->{'calist'} = []; + + while(my $ca = readdir(DIR)) { + chomp($ca); + next if $ca eq "."; + next if $ca eq ".."; + next if $ca eq "tmp"; + + my $dir = $self->{'init'}->{'basedir'}."/".$ca; + next unless -d $dir; + next unless -s $dir."/cacert.pem"; + next unless -s $dir."/cacert.key"; + push(@{$self->{'calist'}}, $ca); + @{$self->{'calist'}} = sort(@{$self->{'calist'}}); + $self->{$ca}->{'dir'} = $dir; + $self->{$ca}->{'cnf'} = $dir."/openssl.cnf"; + } + closedir(DIR); + + bless($self, $class); +} + +# +# see if the ca can be opened without asking the user +# or show the open dialog +# +sub get_open_name { + my ($self, $main, $opts) = @_; + + my ($ind); + + if((not defined($opts->{'name'})) || ($opts->{'name'} eq "")) { + # if only one CA is defined, open it without prompting + if($#{$self->{'calist'}} == 0) { + $opts->{'name'} = $self->{'calist'}->[0]; + $self->open_ca($main, $opts); + } else { + $main->show_select_ca_dialog('open'); + } + } +} + +# +# open the ca with the given name +# +sub open_ca { + my ($self, $main, $opts, $box) = @_; + + $box->destroy() if(defined($box)); + + GUI::HELPERS::set_cursor($main, 1); + + my ($i, $cnf, @lines, $oldca, $index, $bak, $t); + + GUI::HELPERS::set_status($main, _(" Opening CA: ").$opts->{'name'}); + while(Gtk2->events_pending) { + Gtk2->main_iteration; + } + + if(!exists($self->{$opts->{'name'}})) { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning(_("Invalid CA selected")); + return; + } + + # selected CA is already open + if ((defined($self->{'actca'})) && + ($opts->{'name'} eq $self->{'actca'})) { + GUI::HELPERS::set_cursor($main, 0); + print STDERR "DEBUG: ca $opts->{'name'} already opened\n"; + return; + } + + $self->{'actca'} = $opts->{'name'}; + $self->{'cadir'} = $self->{$opts->{'name'}}->{'dir'}; + $main->{'cadir'} = $self->{'cadir'}; + + if(my $dir = HELPERS::get_export_dir($main)) { + $main->{'exportdir'} = $dir; + } + + # update config (necessary for update from old tinyca) + $cnf = $self->{$opts->{'name'}}->{'cnf'}; + open(IN, "<$cnf"); + @lines = ; + close(IN); + for($i = 0; $lines[$i]; $i++) { + $lines[$i] =~ s/private\/cakey.pem/cacert.key/; + } + open(OUT, ">$cnf"); + print OUT @lines; + close(OUT); + + $main->{'mw'}->set_title( "Tiny CA Management $main->{'version'}". + " - $self->{'actca'}" + ); + + $main->{'CERT'}->{'lastread'} = 0; + $main->{'REQ'}->{'lastread'} = 0; + $main->{'KEY'}->{'lastread'} = 0; + + delete($main->{'OpenSSL'}->{'CACHE'}); + delete($main->{'CERT'}->{'OpenSSL'}->{'CACHE'}); + delete($main->{'REQ'}->{'OpenSSL'}->{'CACHE'}); + delete($main->{'OpenSSL'}); + + GUI::HELPERS::set_status($main, _(" Initializing OpenSSL")); + $main->{'OpenSSL'} = OpenSSL->new( + $main->{'init'}->{'opensslbin'}, $main->{'tmpdir'}); + + $index = $self->{'cadir'}."/index.txt"; + + GUI::HELPERS::set_status($main, _(" Check for CA Version")); + while(Gtk2->events_pending) { + Gtk2->main_iteration; + } + + open(INDEX, "+<$index") || do { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_error(_("Can't open index file: ".$!)); + return; + }; + + while() { + if(/Email=/) { + $oldca = 1; + last; + } + } + close(INDEX); + + # offer CA conversion for old CAs and openssl >= 0.9.7 + if($oldca && ($main->{'OpenSSL'}->{'version'} eq "0.9.7") && + !$opts->{'noconv'} && !$opts->{'doconv'}) { + GUI::HELPERS::set_status($main, _(" Convert CA")); + while(Gtk2->events_pending) { + Gtk2->main_iteration; + } + $self->{'actca'} = undef; + GUI::HELPERS::set_cursor($main, 0); + $main->show_ca_convert_dialog($opts); + return; + } + + if($opts->{'doconv'}) { + open(INDEX, "+<$index") || do { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_error(_("Can't open index file: ".$!)); + return; + }; + $bak = $index.".bak"; + open(BAK, "+>$bak") || do { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_error(_("Can't open index backup: ").$!); + return; + }; + seek(INDEX, 0, 0); + while() { + print BAK; + } + seek(INDEX, 0, 0); + truncate(INDEX, 0); + seek(BAK, 0, 0); + while() { + $_ =~ s/Email=/emailAddress=/; + print INDEX; + } + close(INDEX); + close(BAK); + + $t = _("This CA is converted for openssl 0.9.7x now."); + $t .= "\n"; + $t .= _("You will find a backup copy of the index file at: "); + $t .= $bak; + + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_info($t); + } + + GUI::HELPERS::set_cursor($main, 1); + + GUI::HELPERS::set_status($main, _(" Read Configuration")); + while(Gtk2->events_pending) { + Gtk2->main_iteration; + } + $main->{'TCONFIG'}->init_config($main, $opts->{'name'}); + + GUI::HELPERS::set_status($main, _(" Create GUI")); + while(Gtk2->events_pending) { + Gtk2->main_iteration; + } + $main->create_mframe(1); + + GUI::HELPERS::set_status($main, _(" Create Toolbar")); + while(Gtk2->events_pending) { + Gtk2->main_iteration; + } + $main->create_toolbar('ca'); + + GUI::HELPERS::set_status($main, _(" Actual CA: ").$self->{'actca'}); + while(Gtk2->events_pending) { + Gtk2->main_iteration; + } + + GUI::HELPERS::set_cursor($main, 0); + + $main->{'nb'}->set_current_page(0); + + return; +} + +# +# get name for deleting a CA +# +sub get_ca_delete { + my ($self, $main, $name) = @_; + + if(!defined($name)) { + $main->show_select_ca_dialog('delete'); + return; + }elsif(!exists($self->{$name})) { + $main->show_select_ca_dialog('delete'); + GUI::HELPERS::print_warning(_("Invalid CA selected")); + return; + }else { + $self->delete_ca($main, $name); + } + + return; +} + +# +# delete given CA +# +sub delete_ca { + my ($self, $main, $name, $box) = @_; + + my ($ind, @tmp, $t); + + $box->destroy() if(defined($box)); + + GUI::HELPERS::set_cursor($main, 1); + + _rm_dir($self->{$name}->{'dir'}); + + if((defined($self->{'actca'})) && + ($name eq $self->{'actca'})) { + $self->{'actca'} = undef; + } + + $main->{'cabox'}->destroy() if(defined($main->{'cabox'})); + delete($main->{'cabox'}); + + $main->{'reqbox'}->destroy() if(defined($main->{'reqbox'})); + delete($main->{'reqbox'}); + + $main->{'keybox'}->destroy() if(defined($main->{'keybox'})); + delete($main->{'keybox'}); + + $main->{'certbox'}->destroy() if(defined($main->{'certbox'})); + delete($main->{'certbox'}); + + for(my $i = 0; $i < 4; $i++) { + $main->{'nb'}->remove_page($i); + } + + delete($main->{'reqbrowser'}); + delete($main->{'certbrowser'}); + + delete($main->{'REQ'}->{'reqlist'}); + delete($main->{'CERT'}->{'certlist'}); + + foreach(@{$self->{'calist'}}) { + next if $_ eq $name; + push(@tmp, $_); + } + $self->{'calist'} = \@tmp; + + delete($self->{$name}); + + $main->create_mframe(); + + GUI::HELPERS::set_cursor($main, 0); + + $t = sprintf(_("CA: %s deleted"), $name); + GUI::HELPERS::print_info($t); + + return; +} + +# +# check if all data for creating a ca is available +# +sub get_ca_create { + my ($self, $main, $opts, $box, $mode) = @_; + + $box->destroy() if(defined($box)); + + my ($action, $index, $serial, $t, $parsed); + + if(not(defined($opts))) { + $opts = {}; + $opts->{'days'} = 3650; # set default to 10 years + $opts->{'bits'} = 4096; + $opts->{'digest'} = 'sha1'; + + if(defined($mode) && $mode eq "sub") { # create SubCA, use defaults + $opts->{'parentca'} = $main->{'CA'}->{'actca'}; + + $parsed = $main->{'CERT'}->parse_cert($main, 'CA'); + if(defined $parsed->{'C'}) { + $opts->{'C'} = $parsed->{'C'}; + } + if(defined $parsed->{'ST'}) { + $opts->{'ST'} = $parsed->{'ST'}; + } + if(defined $parsed->{'L'}) { + $opts->{'L'} = $parsed->{'L'}; + } + if(defined $parsed->{'O'}) { + $opts->{'O'} = $parsed->{'O'}; + } + if(defined $parsed->{'OU'}) { + my $cc = 0; + foreach my $ou (@{$parsed->{'OU'}}) { + $opts->{'OU'}->[$cc++] = $ou; + } + } + } + + $main->show_ca_dialog($opts, $mode); + return; + } + + if(defined($mode) && $mode eq "sub") { + if(not defined($opts->{'parentpw'})) { + $main->show_ca_dialog($opts, $mode); + GUI::HELPERS::print_warning( + _("Password of parent CA is needed for creating a Sub CA")); + return; + } + } + + if((not defined($opts->{'name'})) || + ($opts->{'name'} eq "") || + ($opts->{'name'} =~ /\s/)) { + $main->show_ca_dialog($opts, $mode); + GUI::HELPERS::print_warning(_("Name must be filled in and must") + ._(" not contain Spaces")); + return; + } + + if((not defined($opts->{'C'})) || + ($opts->{'C'} eq "") || + (not defined($opts->{'CN'})) || + ($opts->{'CN'} eq "") || + (not defined($opts->{'passwd'})) || + ($opts->{'passwd'} eq "")) { + $main->show_ca_dialog($opts, $mode); + GUI::HELPERS::print_warning( + _("Please specify at least Common Name, ") + ._("Country and Password")); + return; + } + + if((not defined($opts->{'passwd2'})) || + $opts->{'passwd'} ne $opts->{'passwd2'}) { + $main->show_ca_dialog($opts, $mode); + GUI::HELPERS::print_warning(_("Passwords don't match")); + return; + } + + $opts->{'C'} = uc($opts->{'C'}); + + if(length($opts->{'C'}) != 2) { + $main->show_ca_dialog($opts, $mode); + GUI::HELPERS::print_warning(_("Country must be exact 2 letter code")); + return; + } + + $t = sprintf(_("CA: %s already exists"), $opts->{'name'}); + if(defined($self->{$opts->{'name'}})) { + $main->show_ca_dialog($opts, $mode); + GUI::HELPERS::print_warning($t); + return; + } + + # warn "call create_ca_env with bits: $opts->{'bits'}\n"; + + $self->create_ca_env($main, $opts, $mode); + + return; +} + +# +# check if all data for importing a CA is available +# +sub get_ca_import { + my ($self, $main, $opts, $box) = @_; + + $box->destroy() if(defined($box)); + + my ($name, $t, $parsed, $constr); + + if(!(defined($opts))) { + $opts = {}; + $opts->{'days'} = 3650; # set default to 10 years + $opts->{'bits'} = 4096; + $opts->{'digest'} = 'sha1'; + + $main->show_ca_import_dialog($opts); + return; + } + + # check options given in dialog + if((not defined($opts->{'name'})) || + ($opts->{'name'} eq "") || + ($opts->{'name'} =~ /\s/)) { + $main->show_ca_import_dialog($opts); + GUI::HELPERS::print_warning( + _("Name for storage must be filled in and must not contain spaces")); + return; + } + + if(((not defined($opts->{'passwd'})) || + ($opts->{'passwd'} eq '')) && + (!$opts->{'pwwarning'})) { + $main->show_ca_import_dialog($opts); + GUI::HELPERS::print_warning( + _("You didn't give a password for the private CA key."). + "\n". + _("The import will fail, if the key is encrypted.")); + $opts->{'pwwarning'} = 1; + return; + } + + if((not defined($opts->{'newpasswd'})) || + ($opts->{'newpasswd'} eq '')) { + $main->show_ca_import_dialog($opts); + GUI::HELPERS::print_warning( + _("Please give a new password for the CA")); + return; + } + + if((not defined($opts->{'newpasswd2'})) || + $opts->{'newpasswd'} ne $opts->{'newpasswd2'}) { + $main->show_ca_import_dialog($opts); + GUI::HELPERS::print_warning(_("New passwords don't match")); + return; + } + + if((not defined($opts->{'cacertfile'})) || + ($opts->{'cacertfile'} eq '')) { + $main->show_ca_import_dialog($opts); + GUI::HELPERS::print_warning( + _("Please give a CA certificate to import")); + return; + } + if(not -r $opts->{'cacertfile'}) { + $main->show_ca_import_dialog($opts); + $t = sprintf(_("Can't read CA certificate file:\n%s"), + $opts->{'cacertfile'}); + GUI::HELPERS::print_warning($t); + return; + } + + if((not defined($opts->{'cakeyfile'})) || + ($opts->{'cakeyfile'} eq '')) { + $main->show_ca_import_dialog($opts); + GUI::HELPERS::print_warning( + _("Please give a CA keyfile to import")); + return; + } + if(not -r $opts->{'cakeyfile'}) { + $main->show_ca_import_dialog($opts); + $t = sprintf(_("Can't read CA key file:\n%s"), + $opts->{'cakeyfile'}); + GUI::HELPERS::print_warning($t); + return; + } + + if(((not defined($opts->{'indexfile'})) || + ($opts->{'indexfile'} eq '')) && + (not defined($opts->{'indexwarning'}))) { + + $main->show_ca_import_dialog($opts); + + $t = _("Please give an Index file to import.\n"); + $t .= _("If you don't have an Index file, i'll try to generate one.\n"); + $t .= _("Attention: This will cause all Certificates to show up as valid.\n"); + $t .= _("Attention: Revoked Certificates will not be determined."); + + $opts->{'indexwarning'} = 1; + + GUI::HELPERS::print_warning($t); + return; + } + if(defined($opts->{'indexfile'}) && + $opts->{'indexfile'} ne '' && + not -r $opts->{'indexfile'}) { + $main->show_ca_import_dialog($opts); + $t = sprintf(_("Can't read Index file:\n%s"), + $opts->{'indexfile'}); + GUI::HELPERS::print_warning($t); + return; + } elsif(defined($opts->{'indexfile'}) && + $opts->{'indexfile'} ne '') { + $opts->{'gotindex'} = 1; + } + + if((not defined($opts->{'certdir'})) || + ($opts->{'certdir'} eq '')) { + $main->show_ca_import_dialog($opts); + GUI::HELPERS::print_warning( + _("Please give a directory containing the certificates to import")); + return; + } + if(not -d $opts->{'certdir'}) { + $main->show_ca_import_dialog($opts); + $t = sprintf(_("Can't find certificate directory:\n%s"), + $opts->{'certdir'}); + GUI::HELPERS::print_warning($t); + return; + } + + $name = $opts->{'name'}; + + if(defined($self->{$name})) { + $main->show_ca_import_dialog($opts); + $t = sprintf( + _("CA: %s already exists. Please choose another name"), + $name); + GUI::HELPERS::print_warning($t); + return; + } + + # check ca certificate and key + $parsed = $main->{'OpenSSL'}->parsecert( + undef, undef, $opts->{'cacertfile'}, 1); + + # check if it's really a CA certificate + if(defined($parsed->{'EXT'}->{'X509v3 Basic Constraints: critical'})) { + $constr = $parsed->{'EXT'}->{'X509v3 Basic Constraints: critical'}->[0]; + } elsif(defined($parsed->{'EXT'}->{'X509v3 Basic Constraints'})) { + $constr = $parsed->{'EXT'}->{'X509v3 Basic Constraints'}->[0]; + } else { + $t = _("Can't find X509v3 Basic Constraints in CA Certificate\n"); + $t .= _("Import canceled"); + GUI::HELPERS::print_warning($t); + return; + } + + if($constr !~ /CA:TRUE/i) { + $t = _("The selected CA Certificate is no valid CA certificate\n"); + $t .= sprintf(_("X509v3 Basic Constraint is set to: %s"), $constr); + GUI::HELPERS::print_warning($t); + return; + } + + $opts->{'cacertdata'} = $parsed->{'PEM'}; + + # now read the data from the files + if(defined($opts->{'gotindex'})) { + open(INDEX, "<$opts->{'indexfile'}") || do { + $t = sprintf(_("Can't open Index file:\n%s"), + $opts->{'indexfile'}); + GUI::HELPERS::print_warning($t); + return; + }; + while() { + $opts->{'serial'} = hex((split(/\t/, $_))[3]); + $opts->{'indexdata'} .= $_; + } + close(INDEX); + $opts->{'serial'} +=1; + $opts->{'serial'} = sprintf("%x", $opts->{'serial'}); + } + + $main->show_import_verification("cacert", $opts, $parsed); + + return; +} + +# +# do the real import +# +sub import_ca { + my ($self, $main, $opts, $box) = @_; + + my ($t, $f, $cacertfile, $cakeyfile, $certfile, $c, $p, @files, $ext, $ret, + @d, $timestring, $indexline, $index, $serial, $subjects, $serials, + $timestrings); + + my $format = "DER"; + my $data = {}; + my $ca = $opts->{'name'}; + + if (hex($opts->{'serial'}) < 1) { + $opts->{'serial'} = "01"; + } + + if(defined($box)) { + $box->destroy(); + } + + $opts->{'cakeydata'} = $main->{'KEY'}->key_change_passwd( + $main, $opts->{'cakeyfile'}, $opts->{'passwd'}, + $opts->{'newpasswd'}); + + if($opts->{'cakeydata'} eq 1) { + return; + } + + $self->create_ca_env($main, $opts, 'import'); + + # now read all certificates + opendir(DIR, $opts->{'certdir'}) || do { + $t = sprintf(_("Can't open Certificate directory: %s"), + $opts->{'certdir'}); + GUI::HELPERS::print_warning($t); + return; + }; + + # just count the files + while($f = readdir(DIR)) { + next if($f =~ /^\./); + $certfile = $opts->{'certdir'}."/".$f; + push (@files, $certfile); + $c++; + } + + GUI::HELPERS::set_cursor($main, 1); + + # import all the certificate files and gather information if necessary + $main->{'barbox'}->pack_start($main->{'progress'}, 0, 0, 0); + foreach $certfile (@files) { + $t = sprintf(_(" Read Certificate: %s"), $certfile); + GUI::HELPERS::set_status($main, $t); + $p += 100/$c; + $main->{'progress'}->set_fraction($p/100); + while(Gtk2->events_pending) { + Gtk2->main_iteration; + } + + open(IN, "<$certfile") || do { + GUI::HELPERS::set_cursor($main, 0); + $t = sprintf(_("Can't read Certificate file: %s"), $certfile); + return; + }; + $data->{'raw'} = ''; + $data->{'raw'} .= $_ while(); + close(IN); + $format = "PEM" if($data->{'raw'} =~ /BEGIN CERTIFICATE/); + + if($format eq "PEM") { + $data->{'PEM'} = $data->{'raw'}; + } + + $data->{'parsed'} = $main->{'OpenSSL'}->parsecert( + undef, undef, $certfile, 1 + ); + + $data->{'name'} = HELPERS::gen_name($data->{'parsed'}); + $data->{'name'} = HELPERS::enc_base64($data->{'name'}); + $data->{'name'} .= ".pem"; + + $data->{'file'} = $self->{$ca}->{'dir'}."/certs/".$data->{'name'}; + + open(OUT, ">$data->{'file'}") || do { + GUI::HELPERS::set_cursor($main, 0); + $t = sprintf(_("Can't write Certificate file: %s"), + $data->{'file'}); + return; + }; + print OUT $data->{'PEM'}; + + if(not defined($opts->{'gotindex'})) { + # get information for index.txt file + @d = localtime($data->{'parsed'}->{'EXPDATE'}); + $timestring = sprintf("%02d%02d%02d%02d%02d%02dZ", + $d[5]%100, $d[4]+1, $d[3], $d[2], $d[1], $d[0]); + + # try to detect index clashes FIXME: only the newer is kept + if(exists($subjects->{$data->{'parsed'}->{'SUBJECT'}})) { + if(hex($data->{'parsed'}->{'SERIAL'}) >= + hex($serials->{$data->{'parsed'}->{'SUBJECT'}})) { + $subjects->{$data->{'parsed'}->{'SUBJECT'}} = 1; + $serials->{$data->{'parsed'}->{'SUBJECT'}} = + $data->{'parsed'}->{'SERIAL'}; + $timestrings->{$data->{'parsed'}->{'SUBJECT'}} = + $timestring; + } + } else { + $subjects->{$data->{'parsed'}->{'SUBJECT'}} = 1; + $serials->{$data->{'parsed'}->{'SUBJECT'}} = + $data->{'parsed'}->{'SERIAL'}; + $timestrings->{$data->{'parsed'}->{'SUBJECT'}} = + $timestring; + } + + # get information for serial file + if(hex($data->{'parsed'}->{'SERIAL'}) >= hex($opts->{'serial'})) { + $opts->{'serial'} = sprintf("%x", hex($data->{'parsed'}->{'SERIAL'})); + } + $opts->{'serial'} = hex($opts->{'serial'}) + 1; + $opts->{'serial'} = sprintf("%x", $opts->{'serial'}); + } + + close(OUT); + } + + # now build the indexdata + foreach my $s (keys(%$subjects)) { + $indexline = "V\t$timestrings->{$s}\t\t$serials->{$s}\tunknown\t$s\n"; + $opts->{'indexdata'} .= $indexline; + } + + # create index file + $index = $self->{$ca}->{'dir'}."/index.txt"; + open(OUT, ">$index") || do { + GUI::HELPERS::print_error(_("Can't open Index file: ").$!); + return; + }; + print OUT $opts->{'indexdata'}; + close OUT; + + $cacertfile = $self->{$ca}->{'dir'}."/cacert.pem"; + $cakeyfile = $self->{$ca}->{'dir'}."/cacert.key"; + + # write cacertfile + open(OUT, ">$cacertfile") || do { + GUI::HELPERS::set_cursor($main, 0); + $t = sprintf(_("Can't write CA Certificate file: %s"), + $cacertfile); + return; + }; + print OUT $opts->{'cacertdata'}; + close(OUT); + + # check serial number of CA file + $data->{'parsed'} = $main->{'OpenSSL'}->parsecert( + undef, undef, $cacertfile, 1 + ); + if(hex($data->{'parsed'}->{'SERIAL'}) >= hex($opts->{'serial'})) { + $opts->{'serial'} = sprintf("%x", hex($opts->{'serial'})); + } + $opts->{'serial'} = hex($opts->{'serial'}) + 1; + $opts->{'serial'} = sprintf("%x", $opts->{'serial'}); + + # create serial file + $serial = $self->{$ca}->{'dir'}."/serial"; + open(OUT, ">$serial") || do { + GUI::HELPERS::print_error(_("Can't write Serial file: ").$!); + return; + }; + + if($opts->{'serial'} ne "") { + print OUT uc($opts->{'serial'}); + }else{ + print OUT "01"; + } + close OUT; + + # write keyfile + open(OUT, ">$cakeyfile") || do { + GUI::HELPERS::set_cursor($main, 0); + $t = sprintf(_("Can't write CA Key file: %s"), + $cakeyfile); + return; + }; + print OUT $opts->{'cakeydata'}; + close(OUT); + + ($ret, $ext) = $main->{'OpenSSL'}->newcrl( + config => $self->{$ca}->{'cnf'}, + pass => $opts->{'newpasswd'}, + crldays => 30, + outfile => $self->{$ca}->{'dir'}."/crl/crl.pem", + format => 'PEM' + ); + + if ((not -s $self->{$ca}->{'dir'}."/crl/crl.pem") || $ret) { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_error(_("Generating CRL failed"), $ext); + print STDERR "DEBUG: newcrl returned $ext\n"; + die; + return; + } + + + GUI::HELPERS::set_cursor($main, 0); + $main->{'barbox'}->remove($main->{'progress'}); + + push(@{$self->{'calist'}}, $ca); + @{$self->{'calist'}} = sort(@{$self->{'calist'}}); + + $t = sprintf(_("Succesfully imported %d certificates\n"), $c); + $t.= _("Check the configuration of your imported CA."); + GUI::HELPERS::print_info($t); + + $self->open_ca($main, $opts); + + return; +} + +# +# create a new CA, environment: dirs, etc. +# +sub create_ca_env { + my ($self, $main, $opts, $mode) = @_; + + my ($t, $index, $serial); + + if((!defined($opts->{'name'})) || $opts->{'name'} eq '') { + GUI::HELPERS::print_error(_("No CA name given")); + return; + } + + # create directories + $self->{$opts->{'name'}}->{'dir'} = + $self->{'init'}->{'basedir'}."/".$opts->{'name'}; + + mkdir($self->{$opts->{'name'}}->{'dir'}, 0700) || do { + GUI::HELPERS::print_warning(_("Can't create directory: ").$!); + return; + }; + + mkdir($self->{$opts->{'name'}}->{'dir'}."/req", 0700) || do { + GUI::HELPERS::print_warning(_("Can't create directory: ").$!); + return; + }; + + mkdir($self->{$opts->{'name'}}->{'dir'}."/keys", 0700) || do { + GUI::HELPERS::print_warning(_("Can't create directory: ").$!); + return; + }; + + mkdir($self->{$opts->{'name'}}->{'dir'}."/certs", 0700) || do { + GUI::HELPERS::print_warning(_("Can't create directory: ").$!); + return; + }; + + mkdir($self->{$opts->{'name'}}->{'dir'}."/crl", 0700) || do { + GUI::HELPERS::print_warning(_("Can't create directory: ").$!); + return; + }; + + mkdir($self->{$opts->{'name'}}->{'dir'}."/newcerts", 0700) || do { + GUI::HELPERS::print_warning(_("Can't create directory: ").$!); + return; + }; + + # create configuration file + my $in = $self->{'init'}->{'templatedir'}."/openssl.cnf"; + my $out = $self->{$opts->{'name'}}->{'dir'}."/openssl.cnf"; + + open(IN, "<$in") || do { + $t = sprintf(_("Can't open template file %s %s"), $in, $!); + GUI::HELPERS::print_error($t); + return; + }; + open(OUT, ">$out") || do { + $t = sprintf(_("Can't open output file: %s: %s"),$out, $!); + GUI::HELPERS::print_error($t); + return; + }; + while() { + s/\%dir\%/$self->{$opts->{'name'}}->{'dir'}/; + print OUT; + } + close IN; + close OUT; + $self->{$opts->{'name'}}->{'cnf'} = $out; + + $main->{'TCONFIG'}->init_config($main, $opts->{'name'}); + + # create some more files + $index = $self->{$opts->{'name'}}->{'dir'}."/index.txt"; + open(OUT, ">$index") || do { + GUI::HELPERS::print_error(_("Can't open Index file: ").$!); + return; + }; + close(OUT); + + $serial = $self->{$opts->{'name'}}->{'dir'}."/serial"; + open(OUT, ">$serial") || do { + GUI::HELPERS::print_error(_("Can't write Serial file: ").$!); + return; + }; + + if(defined($opts->{'serial'}) && $opts->{'serial'} ne "") { + print OUT uc($opts->{'serial'}); + }else{ + print OUT "01"; + } + close(OUT); + + if(defined($mode) && $mode eq "sub") { + $self->create_ca($main, $opts, undef, $mode); + } elsif(defined($mode) && $mode eq "import") { + } else { + GUI::TCONFIG::show_config_ca($main, $opts, $mode); + } + + return; +} + +# +# now create the CA certificate and CRL +# +sub create_ca { + my ($self, $main, $opts, $box, $mode) = @_; + + my ($fname, $t, $index, $serial, $ca, $ret, $ext); + + $ca = $self->{'actca'}; + + $box->destroy() if(defined($box)); + + GUI::HELPERS::set_cursor($main, 1); + + if((!defined($opts->{'name'})) || $opts->{'name'} eq '') { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_error(_("No CA name given")); + return; + } + + # create CA certifikate + ($ret, $ext) = $main->{'OpenSSL'}->newkey( + 'bits' => $opts->{'bits'}, + 'outfile' => $self->{$opts->{'name'}}->{'dir'}."/cacert.key", + 'pass' => $opts->{'passwd'} + ); + + if (not -s $self->{$opts->{'name'}}->{'dir'}."/cacert.key" || $ret) { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning(_("Generating key failed"), $ext); + _rm_dir($self->{$opts->{'name'}}->{'dir'}); + delete($self->{$opts->{'name'}}); + return; + } + + my @dn = ( + $opts->{'C'}, + $opts->{'ST'}, + $opts->{'L'}, + $opts->{'O'}, + $opts->{'OU'}->[0], + $opts->{'CN'}, + $opts->{'EMAIL'}, + '', + ''); + + ($ret, $ext) = $main->{'OpenSSL'}->newreq( + 'config' => $self->{$opts->{'name'}}->{'cnf'}, + 'outfile' => $self->{$opts->{'name'}}->{'dir'}."/cacert.req", + 'digest' => $opts->{'digest'}, + 'pass' => $opts->{'passwd'}, + 'dn' => \@dn, + 'keyfile' => $self->{$opts->{'name'}}->{'dir'}."/cacert.key" + ); + + $fname = HELPERS::gen_name($opts); + + $opts->{'reqname'} = HELPERS::enc_base64($fname); + + if (not -s $self->{$opts->{'name'}}->{'dir'}."/cacert.req" || $ret) { + unlink($self->{$opts->{'name'}}->{'dir'}."/cacert.key"); + unlink($self->{$opts->{'name'}}->{'dir'}."/cacert.req"); + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning(_("Generating Request failed"), $ext); + _rm_dir($self->{$opts->{'name'}}->{'dir'}); + delete($self->{$opts->{'name'}}); + return; + } else { + if(defined($mode) && $mode eq "sub") { + # for SubCAs: copy the request to the signing CA + open(IN, "<$self->{$opts->{'name'}}->{'dir'}"."/cacert.req") || do { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning(_("Can't read Certificate")); + return; + }; + open(OUT, ">$self->{$ca}->{'dir'}"."/req/".$opts->{'reqname'}.".pem") || do { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning(_("Can't write Certificate")); + return; + }; + print OUT while(); + close IN; close OUT; + + # for SubCAs: copy the key to the signing CA + open(IN, "<$self->{$opts->{'name'}}->{'dir'}"."/cacert.key") || do { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning(_("Can't read Certificate")); + return; + }; + open(OUT, ">$self->{$ca}->{'dir'}"."/keys/".$opts->{'reqname'}.".pem") || do { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning(_("Can't write Certificate")); + return; + }; + print OUT while(); + close IN; close OUT; + } + } + + if(defined($mode) && $mode eq "sub") { + ($ret, $ext) = $main->{'REQ'}->sign_req( + $main, + { + 'mode' => "sub", + 'config' => $self->{$opts->{'name'}}->{'cnf'}, + 'outfile' => $self->{$opts->{'name'}}->{'dir'}."/cacert.pem", + 'reqfile' => $self->{$opts->{'name'}}->{'dir'}."/cacert.req", + 'outdir' => $self->{$ca}->{'dir'}."/newcerts/", + 'keyfile' => $self->{$ca}->{'dir'}."/cacert.key", + 'cacertfile' => $self->{$ca}->{'dir'}."/cacert.pem", + 'pass' => $opts->{'passwd'}, + 'days' => $opts->{'days'}, + 'parentpw' => $opts->{'parentpw'}, + 'reqname' => $opts->{'reqname'} + } + ); + } else { + ($ret, $ext) = $main->{'OpenSSL'}->newcert( + 'config' => $self->{$opts->{'name'}}->{'cnf'}, + 'outfile' => $self->{$opts->{'name'}}->{'dir'}."/cacert.pem", + 'keyfile' => $self->{$opts->{'name'}}->{'dir'}."/cacert.key", + 'reqfile' => $self->{$opts->{'name'}}->{'dir'}."/cacert.req", + 'digest' => $opts->{'digest'}, + 'pass' => $opts->{'passwd'}, + 'days' => $opts->{'days'} + ); + } + + if (not -s $self->{$opts->{'name'}}->{'dir'}."/cacert.pem" || $ret) { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning( + _("Generating certificate failed"), $ext); + _rm_dir($self->{$opts->{'name'}}->{'dir'}); + delete($self->{$opts->{'name'}}); + return; + } + + unlink($self->{$opts->{'name'}}->{'dir'}."/cacert.req"); + + if(defined($mode) && $mode eq "sub") { + # create file containing chain of ca certificates + my $in; + if (-f $self->{$ca}->{'dir'}."/cachain.pem") { + $in = $self->{$ca}->{'dir'}."/cachain.pem"; + } else { + $in = $self->{$ca}->{'dir'}."/cacert.pem"; + } + my $out = $self->{$opts->{'name'}}->{'dir'}."/cachain.pem"; + + open(IN, "<$in") || do { + $t = sprintf( + _("Can't open ca certificate file %s %s"), $in, $!); + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning($t); + _rm_dir($self->{$opts->{'name'}}->{'dir'}); + delete($self->{$opts->{'name'}}); + return; + }; + open(OUT, ">$out") || do { + $t = sprintf( + _("Can't create certificate chain file: %s: %s"),$out, $!); + GUI::HELPERS::set_cursor($main, 0); + $main->print_warning($t); + _rm_dir($self->{$opts->{'name'}}->{'dir'}); + delete($self->{$opts->{'name'}}); + return; + }; + while() { + print OUT; + } + close IN; + + # now append the certificate of the created SubCA + $in = $self->{$opts->{'name'}}->{'dir'}."/cacert.pem"; + open(IN, "<$in") || do { + $t = sprintf( + _("Can't open ca certificate file %s %s"), $in, $!); + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning($t); + _rm_dir($self->{$opts->{'name'}}->{'dir'}); + delete($self->{$opts->{'name'}}); + return; + }; + + while() { + print OUT; + } + close OUT; + } + + ($ret, $ext) = $main->{'OpenSSL'}->newcrl( + config => $self->{$opts->{'name'}}->{'cnf'}, + pass => $opts->{'passwd'}, + crldays => $main->{'TCONFIG'}->{'server_ca'}->{'default_crl_days'}, + outfile => $self->{$opts->{'name'}}->{'dir'}."/crl/crl.pem", + format => 'PEM' + ); + + if (not -s $self->{$opts->{'name'}}->{'dir'}."/crl/crl.pem" || $ret) { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning(_("Generating CRL failed"), $ext); + _rm_dir($self->{$opts->{'name'}}->{'dir'}); + delete($self->{$opts->{'name'}}); + return; + } + + # seems to be done + push(@{$self->{'calist'}}, $opts->{'name'}); + @{$self->{'calist'}} = sort(@{$self->{'calist'}}); + $t = sprintf(_("CA: %s created"), $opts->{'name'}); + GUI::HELPERS::set_cursor($main, 0); + + GUI::HELPERS::print_info($t); + + $self->open_ca($main, $opts); + return; +} + +# +# export ca certificate chain +# +sub export_ca_chain { + my ($self, $main, $opts, $box) = @_; + + my($ca, $chainfile, $parsed, $out, $t); + + $box->destroy() if(defined($box)); + + $ca = $self->{'actca'}; + + if(not defined($opts)) { + $opts->{'format'} = 'PEM'; + $opts->{'outfile'} = "$main->{'exportdir'}/$ca-cachain.pem"; + $main->show_ca_chain_export_dialog($opts); + return; + } + + GUI::HELPERS::set_cursor($main, 1); + + $chainfile = $self->{$ca}->{'dir'}."/cachain.pem"; + + open(IN, "<$self->{$ca}->{'dir'}"."/cachain.pem") || do { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning( + _("Can't open certificate chain file: %s: %s"), + $self->{$ca}->{'dir'}."/cachain.pem", $!); + return; + }; + + open(OUT, ">$opts->{'outfile'}") || do { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning( + _("Can't open output file: %s: %s"), + $opts->{'outfile'}, $!); + return; + }; + + print OUT while(); + close OUT; + + $main->{'exportdir'} = HELPERS::write_export_dir($main, + $opts->{'outfile'}); + + GUI::HELPERS::set_cursor($main, 0); + + $t = sprintf(_("Certificate Chain succesfully exported to: %s"), + $opts->{'outfile'}); + GUI::HELPERS::print_info($t); + + return; +} + +# +# export ca certificate +# +sub export_ca_cert { + my ($self, $main, $opts, $box) = @_; + + my($ca, $certfile, $parsed, $out, $t); + + $box->destroy() if(defined($box)); + + GUI::HELPERS::set_cursor($main, 1); + + $ca = $self->{'actca'}; + + $certfile = $self->{$ca}->{'dir'}."/cacert.pem"; + + if(not defined($opts)) { + $opts->{'format'} = 'PEM'; + $opts->{'outfile'} = "$main->{'exportdir'}/$ca-cacert.pem"; + GUI::HELPERS::set_cursor($main, 0); + $main->show_ca_export_dialog($opts); + return; + } + + $parsed = $main->{'CERT'}->parse_cert($main, 'CA'); + + if(not defined $parsed) { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_error(_("Can't read CA certificate")); + } + + if($opts->{'format'} eq "PEM") { + $out = $parsed->{'PEM'}; + } elsif ($opts->{'format'} eq "DER") { + $out = $parsed->{'DER'}; + } elsif ($opts->{'format'} eq "TXT") { + $out = $parsed->{'TEXT'}; + } else { + $t = sprintf(_("Invalid Format for export_ca_cert(): %s"), + $opts->{'format'}); + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning($t); + return; + } + + open(OUT, ">$opts->{'outfile'}") || do { + GUI::HELPERS::set_cursor($main, 0); + $t = sprintf(_("Can't open output file: %s: %s"), + $opts->{'outfile'}, $!); + GUI::HELPERS::print_warning($t); + return; + }; + + print OUT $out; + close OUT; + + $main->{'exportdir'} = HELPERS::write_export_dir($main, + $opts->{'outfile'}); + + GUI::HELPERS::set_cursor($main, 0); + $t = sprintf(_("Certificate succesfully exported to: %s"), + $opts->{'outfile'}); + GUI::HELPERS::print_info($t); + + return; +} + +# +# export crl +# +sub export_crl { + my ($self, $main, $opts, $box) = @_; + + my($ca, $t, $ret, $ext); + + $box->destroy() if(defined($box)); + + GUI::HELPERS::set_cursor($main, 1); + + $ca = $self->{'actca'}; + + if(not defined($opts)) { + $opts->{'outfile'} = "$main->{'exportdir'}/$ca-crl.pem"; + $opts->{'format'} = 'PEM'; + $opts->{'days'} = $main->{'TCONFIG'}->{'server_ca'}->{'default_crl_days'}; + + GUI::HELPERS::set_cursor($main, 0); + $main->show_crl_export_dialog($opts); + return; + } + + if((not defined($opts->{'outfile'})) || ($opts->{'outfile'} eq '')) { + GUI::HELPERS::set_cursor($main, 0); + $t = _("Please give the output file"); + $main->show_crl_export_dialog($opts); + GUI::HELPERS::print_warning($t); + return; + }; + + if((not defined($opts->{'passwd'})) || ($opts->{'passwd'} eq '')) { + GUI::HELPERS::set_cursor($main, 0); + $t = _("Please give the CA password to create the Revocation List"); + $main->show_crl_export_dialog($opts); + GUI::HELPERS::print_warning($t); + return; + } + + if(not defined($main->{'OpenSSL'})) { + $main->init_openssl($ca); + } + + ($ret, $ext) = $main->{'OpenSSL'}->newcrl( + config => $self->{$ca}->{'cnf'}, + pass => $opts->{'passwd'}, + crldays => $opts->{'days'}, + outfile => $opts->{'outfile'}, + format => $opts->{'format'} + ); + + GUI::HELPERS::set_cursor($main, 0); + + if($ret eq 1) { + $t = _("Wrong CA password given\nGenerating Revocation List failed"); + GUI::HELPERS::print_warning($t, $ext); + return; + } elsif($ret eq 2) { + $t = _("CA Key not found\nGenerating Revocation List failed"); + GUI::HELPERS::print_warning($t, $ext); + return; + } elsif($ret) { + $t = _("Generating Revocation List failed"); + GUI::HELPERS::print_warning($t, $ext); + return; + } + + if (not -s $opts->{'outfile'}) { + $t = _("Generating Revocation List failed"); + GUI::HELPERS::print_warning($t); + return; + } + + $main->{'exportdir'} = HELPERS::write_export_dir($main, + $opts->{'outfile'}); + + $t = sprintf(_("CRL successfully exported to: %s"), + $opts->{'outfile'}); + GUI::HELPERS::print_info($t, $ext); + + return; +} + +sub _rm_dir { + my $dir = shift; + + my $dirh; + + opendir($dirh, $dir); + + while(my $f = readdir($dirh)) { + next if $f eq '.'; + next if $f eq '..'; + + if(-d $dir."/".$f) { + _rm_dir($dir."/".$f); + } else { + unlink($dir."/".$f); + } + } + closedir(DIR); + + rmdir($dir); + + return(0); +} + +1 diff --git a/lib/CERT.pm b/lib/CERT.pm new file mode 100644 index 0000000..0bd4267 --- /dev/null +++ b/lib/CERT.pm @@ -0,0 +1,713 @@ +# Copyright (c) Stephan Martin +# +# $Id: CERT.pm,v 1.11 2006/06/28 21:50:41 sm Exp $ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + +use strict; + +package CERT; + +use POSIX; + +sub new { + my $that = shift; + my $class = ref($that) || $that; + + my $self = {}; + + $self->{'OpenSSL'} = shift; + + bless($self, $class); +} + +# +# read certificates in directory into list +# +sub read_certlist { + my ($self, $certdir, $crlfile, $indexfile, $force, $main) = @_; + + my($f, $certlist, $crl, $modt, $parsed, $tmp, $t, $c, $p, @files); + + GUI::HELPERS::set_cursor($main, 1); + + $certlist = []; + + $modt = (stat($certdir))[9]; + + if(defined($self->{'lastread'}) && + ($self->{'lastread'} >= $modt) && + not defined($force)) { + GUI::HELPERS::set_cursor($main, 0); + return(0); + } + + $crl = $self->{'OpenSSL'}->parsecrl($crlfile, $force); + + opendir(DIR, $certdir) || do { + GUI::HELPERS::set_cursor($main, 0); + $t = sprintf(_("Can't open Certificate directory: %s"), $certdir); + GUI::HELPERS::print_warning($t); + return(0); + }; + + while($f = readdir(DIR)) { + next if $f =~ /^\./; + push(@files, $f); + $c++; + } + + $main->{'barbox'}->pack_start($main->{'progress'}, 0, 0, 0); + $main->{'progress'}->show(); + foreach $f (@files) { + next if $f =~ /^\./; + + $f =~ s/\.pem//; + + $tmp = HELPERS::dec_base64($f); + next if not defined($tmp); + next if $tmp eq ""; + + if(defined($main)) { + $t = sprintf(_(" Read Certificate: %s"), $tmp); + GUI::HELPERS::set_status($main, $t); + $p += 100/$c; + if($p/100 <= 1) { + $main->{'progress'}->set_fraction($p/100); + while(Gtk2->events_pending) { + Gtk2->main_iteration; + } + } + } + + my $debugf = $certdir."/".$f.".pem"; + + $parsed = $self->{'OpenSSL'}->parsecert($crlfile, $indexfile, + $certdir."/".$f.".pem", $force); + + defined($parsed) || do { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_error(_("Can't read Certificate")); + }; + + $tmp .= "%".$parsed->{'STATUS'}; + + push(@{$certlist}, $tmp); + } + @{$certlist} = sort(@{$certlist}); + closedir(DIR); + + $self->{'certlist'} = $certlist; + + $self->{'lastread'} = time(); + + if(defined($main)) { + $main->{'progress'}->set_fraction(0); + $main->{'barbox'}->remove($main->{'progress'}); + GUI::HELPERS::set_cursor($main, 0); + } + + return(1); # got new list +} + +# +# get information for renewing a certifikate +# +sub get_renew_cert { + my ($self, $main, $opts, $box) = @_; + + my ($cert, $status, $t, $ca, $cadir); + + $box->destroy() if(defined($box)); + + if((not defined($opts->{'certfile'})) || + (not defined($opts->{'passwd'})) || + ($opts->{'certfile'} eq '') || + ($opts->{'passwd'} eq '')) { + + $cert = $main->{'certbrowser'}->selection_dn(); + + if(not defined($cert)) { + GUI::HELPERS::print_info(_("Please select a Certificate first")); + return; + } + + $ca = $main->{'certbrowser'}->selection_caname(); + $cadir = $main->{'certbrowser'}->selection_cadir(); + $status = $main->{'certbrowser'}->selection_status(); + + if($status eq _("VALID")) { + $t = sprintf( + _("Can't renew Certifikate with Status: %s\nPlease revoke the Certificate first"), + $status); + GUI::HELPERS::print_warning($t); + return; + } + + $opts->{'certname'} = HELPERS::enc_base64($cert); + $opts->{'reqname'} = $opts->{'certname'}; + $opts->{'certfile'} = $cadir."/certs/".$opts->{'certname'}.".pem"; + $opts->{'keyfile'} = $cadir."/keys/".$opts->{'certname'}.".pem"; + $opts->{'reqfile'} = $cadir."/req/".$opts->{'certname'}.".pem"; + + if((not -s $opts->{'certfile'}) || + (not -s $opts->{'keyfile'}) || + (not -s $opts->{'reqfile'})) { + $t = _("Key and Request are necessary for renewal of a Certificate\nRenewal is not possible!"); + GUI::HELPERS::print_warning($t); + return; + } + + $main->show_req_sign_dialog($opts); + return; + } + + $main->{'REQ'}->sign_req($main, $opts); + + return; +} + +# +# get information for revoking a certifikate +# +sub get_revoke_cert { + my ($self, $main, $opts, $box) = @_; + + my ($cert, $status, $t, $ca, $cadir); + + $box->destroy() if(defined($box)); + + if((not defined($opts->{'certfile'})) || + (not defined($opts->{'passwd'})) || + ($opts->{'certfile'} eq '') || + ($opts->{'passwd'} eq '')) { + $opts->{'certfile'} = $main->{'certbrowser'}->selection_fname(); + + if(not defined($opts->{'certfile'})) { + $t = _("Please select a Certificate first"); + GUI::HELPERS::print_info($t); + return; + } + + $ca = $main->{'certbrowser'}->selection_caname(); + $cadir = $main->{'certbrowser'}->selection_cadir(); + $cert = $main->{'certbrowser'}->selection_dn(); + $status = $main->{'certbrowser'}->selection_status(); + + if($status ne _("VALID")) { + $t = sprintf(_("Can't revoke Certifikate with Status: %s"), + $status); + GUI::HELPERS::print_warning($t); + return; + } + + $opts->{'certname'} = HELPERS::enc_base64($cert); + $opts->{'cert'} = $cert; + + $main->show_cert_revoke_dialog($opts); + return; + } + + $self->revoke_cert($main, $opts); + + return; +} + +# +# now really revoke the certificate +# +sub revoke_cert { + my ($self, $main, $opts) = @_; + + my($ca, $cadir, $ret, $t, $ext, $reason); + + $ca = $main->{'certbrowser'}->selection_caname(); + $cadir = $main->{'certbrowser'}->selection_cadir(); + + GUI::HELPERS::set_cursor($main, 1); + + if(defined($opts->{'reason'}) && $opts->{'reason'} ne '') { + $reason = $opts->{'reason'}; + } else { + $reason = 'none'; + } + + ($ret, $ext) = $self->{'OpenSSL'}->revoke( + 'config' => $main->{'CA'}->{$ca}->{'cnf'}, + 'infile' => $cadir."/certs/".$opts->{'certname'}.".pem", + 'pass' => $opts->{'passwd'}, + 'reason' => $reason + ); + + if($ret eq 1) { + GUI::HELPERS::set_cursor($main, 0); + $t = _("Wrong CA password given\nRevoking the Certificate failed"); + GUI::HELPERS::print_warning($t, $ext); + delete($opts->{$_}) foreach(keys(%$opts)); + $opts = undef; + return; + } elsif($ret eq 2) { + GUI::HELPERS::set_cursor($main, 0); + $t = _("CA Key not found\nRevoking the Certificate failed"); + GUI::HELPERS::print_warning($t, $ext); + delete($opts->{$_}) foreach(keys(%$opts)); + $opts = undef; + return; + } elsif($ret) { + GUI::HELPERS::set_cursor($main, 0); + $t = _("Revoking the Certificate failed"); + GUI::HELPERS::print_warning($t, $ext); + delete($opts->{$_}) foreach(keys(%$opts)); + $opts = undef; + return; + } + + ($ret, $ext) = $self->{'OpenSSL'}->newcrl( + 'config' => $main->{'CA'}->{$ca}->{'cnf'}, + 'pass' => $opts->{'passwd'}, + 'crldays' => 365, + 'outfile' => $cadir."/crl/crl.pem" + ); + + if (not -s $cadir."/crl/crl.pem" || $ret) { + delete($opts->{$_}) foreach(keys(%$opts)); + $opts = undef; + + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_error( + _("Generating a new Revocation List failed"), $ext); + } + + $self->{'OpenSSL'}->parsecrl( $cadir."/crl/crl.pem", 1); + + $self->reread_cert($main, $opts->{'cert'}); + + # force reread of certlist + $main->{'certbrowser'}->update($cadir."/certs", + $cadir."/crl/crl.pem", + $cadir."/index.txt", + 0); + + GUI::HELPERS::set_cursor($main, 0); + + delete($opts->{$_}) foreach(keys(%$opts)); + $opts = undef; + + return; +} + +# +# get name of certificatefile to delete +# +sub get_del_cert { + my ($self, $main) = @_; + + my($certname, $cert, $certfile, $status, $t, $cadir, $ca); + + $certfile = $main->{'certbrowser'}->selection_fname(); + + if(not defined $certfile) { + GUI::HELPERS::print_info(_("Please select a Certificate first")); + return; + } + + $ca = $main->{'certbrowser'}->selection_caname(); + $cadir = $main->{'certbrowser'}->selection_cadir(); + $cert = $main->{'certbrowser'}->selection_dn(); + $status = $main->{'certbrowser'}->selection_status(); + + $certname = HELPERS::enc_base64($cert); + + if($status eq _("VALID")) { + GUI::HELPERS::print_warning( + _("Can't delete VALID certificate!\nPlease revoke the Certificate first.")); + return; + } + + $main->show_del_confirm($certfile, 'cert'); + + return; +} + +# +# now really delete the certificatefile +# +sub del_cert { + my ($self, $main, $file) = @_; + + GUI::HELPERS::set_cursor($main, 1); + + unlink($file); + + my $cadir = $main->{'certbrowser'}->selection_cadir(); + + $main->{'certbrowser'}->update($cadir."/certs", + $cadir."/crl/crl.pem", + $cadir."/index.txt", + 0); + + GUI::HELPERS::set_cursor($main, 0); + + return; +} + +# +# get informations for exporting a certificate +# +sub get_export_cert { + my ($self, $main, $opts, $box) = @_; + + $box->destroy() if(defined($box)); + + my($ca, $t, $cn, $email, $cadir); + + if(not defined($opts)) { + $cn = $main->{'certbrowser'}->selection_cn(); + $email = $main->{'certbrowser'}->selection_email(); + + if(not defined $cn) { + GUI::HELPERS::print_info(_("Please select a Certificate first")); + return; + } + + $ca = $main->{'certbrowser'}->selection_caname(); + $cadir = $main->{'certbrowser'}->selection_cadir(); + + $opts->{'status'} = $main->{'certbrowser'}->selection_status(); + $opts->{'cert'} = $main->{'certbrowser'}->selection_dn(); + + $opts->{'certname'} = HELPERS::enc_base64($opts->{'cert'}); + $opts->{'certfile'} = $cadir."/certs/".$opts->{'certname'}.".pem"; + $opts->{'keyfile'} = $cadir."/keys/".$opts->{'certname'}.".pem"; + $opts->{'cafile'} = $cadir."/cacert.pem"; + + if (-f $cadir."/cachain.pem") { + $opts->{'cafile'} = $cadir."/cachain.pem"; + } + + if($opts->{'status'} ne _("VALID")) { + $t = _("Certificate seems not to be VALID"); + $t .= "\n"; + $t .= _("Export is not possible"); + GUI::HELPERS::print_warning($t); + return; + } + + $opts->{'parsed'} = $self->parse_cert($main, $opts->{'certname'}); + + if((defined($email)) && $email ne '' && $email ne ' ') { + $opts->{'outfile'} = "$main->{'exportdir'}/$email-cert.pem"; + }elsif((defined($cn)) && $cn ne '' && $cn ne ' ') { + $opts->{'outfile'} = "$main->{'exportdir'}/$cn-cert.pem"; + }else{ + $opts->{'outfile'} = "$main->{'exportdir'}/cert.pem"; + } + $opts->{'format'} = 'PEM'; + $opts->{'include'} = 0; + $opts->{'incfp'} = 0; + $opts->{'nopass'} = 0; + $opts->{'friendlyname'} = ''; + + $main->show_export_dialog($opts, 'cert'); + return; + } + + if((not defined($opts->{'outfile'})) || ($opts->{'outfile'} eq '')) { + $main->show_export_dialog($opts, 'cert'); + GUI::HELPERS::print_warning( + _("Please give at least the output file")); + return; + } + + if($opts->{'format'} eq 'P12') { + if(not -s $opts->{'keyfile'}) { + $t = _("Key is necessary for export as PKCS#12"); + $t .= "\n"; + $t .= _("Export is not possible!"); + GUI::HELPERS::print_warning($t); + return; + } + + if((not defined($opts->{'p12passwd'})) && + (not $opts->{'nopass'})) { + $opts->{'includeca'} = 1; + $main->show_p12_export_dialog($opts, 'cert'); + return; + } + } elsif(($opts->{'format'} eq 'ZIP') || ($opts->{'format'} eq 'TAR')) { + if(not -s $opts->{'keyfile'}) { + $t = sprintf( + _("Key is necessary for export as %s"), $opts->{'format'}); + $t .= "\n"; + $t .= _("Export is not possible!"); + GUI::HELPERS::print_warning($t); + return; + } + } + + $self->export_cert($main, $opts); #FIXME no need for two functions + + return; +} + + +# +# now really export the certificate +# +sub export_cert { + my ($self, $main, $opts) = @_; + + my($ca, $t, $out, $ret, $ext); + + GUI::HELPERS::set_cursor($main, 1); + + $ca = $main->{'CA'}->{'actca'}; + + if($opts->{'format'} eq 'PEM') { + if($opts->{'incfp'}) { + $out = ''; + $out .= "Fingerprint (MD5): $opts->{'parsed'}->{'FINGERPRINTMD5'}\n"; + $out .= "Fingerprint (SHA1): $opts->{'parsed'}->{'FINGERPRINTSHA1'}\n\n"; + } else { + $out = ''; + } + + $out .= $opts->{'parsed'}->{'PEM'}; + + if($opts->{'include'}) { + open(IN, "<$opts->{'keyfile'}") || do { + GUI::HELPERS::set_cursor($main, 0); + $t = sprintf(_("Can't open Certificate file: %s: %s"), + $opts->{'keyfile'}, $!); + return; + }; + $out .= "\n"; + $out .= $_ while(); + close(IN); + } + } elsif ($opts->{'format'} eq 'DER') { + $out = $opts->{'parsed'}->{'DER'}; + } elsif ($opts->{'format'} eq 'TXT') { + $out = $opts->{'parsed'}->{'TEXT'}; + } elsif ($opts->{'format'} eq 'P12') { + unlink($opts->{'outfile'}); + ($ret, $ext) = $self->{'OpenSSL'}->genp12( + certfile => $opts->{'certfile'}, + keyfile => $opts->{'keyfile'}, + cafile => $opts->{'cafile'}, + outfile => $opts->{'outfile'}, + passwd => $opts->{'passwd'}, + p12passwd => $opts->{'p12passwd'}, + includeca => $opts->{'includeca'}, + nopass => $opts->{'nopass'}, + friendly => $opts->{'friendlyname'} + ); + + GUI::HELPERS::set_cursor($main, 0); + + if($ret eq 1) { + $t = "Wrong password given\nDecrypting Key failed\nGenerating PKCS#12 failed"; + GUI::HELPERS::print_warning($t, $ext); + return; + } elsif($ret || (not -s $opts->{'outfile'})) { + $t = _("Generating PKCS#12 failed"); + GUI::HELPERS::print_warning($t, $ext); + return; + } + + $main->{'exportdir'} = HELPERS::write_export_dir($main, + $opts->{'outfile'}); + + $t = sprintf(_("Certificate and Key successfully exported to %s"), + $opts->{'outfile'}); + GUI::HELPERS::print_info($t, $ext); + return; + + } elsif (($opts->{'format'} eq "ZIP") || ($opts->{'format'} eq "TAR")) { + + my $tmpcert = "$main->{'tmpdir'}/cert.pem"; + my $tmpkey = "$main->{'tmpdir'}/key.pem"; + my $tmpcacert = "$main->{'tmpdir'}/cacert.pem"; + + open(OUT, ">$tmpcert") || do { + GUI::HELPERS::set_cursor($main, 0); + $t = sprintf(_("Can't create temporary file: %s: %s"), + $tmpcert, $!); + GUI::HELPERS::print_warning($t); + return; + }; + print OUT $opts->{'parsed'}->{'PEM'}; + close OUT; + + # store key in temporary location + { + open(IN, "<$opts->{'keyfile'}") || do { + GUI::HELPERS::set_cursor($main, 0); + $t = sprintf(_("Can't read Key file: %s: %s"), $tmpcert, $!); + GUI::HELPERS::print_warning($t); + return; + }; + my @key = ; + close IN; + + open(OUT, ">$tmpkey") || do { + GUI::HELPERS::set_cursor($main, 0); + $t = sprintf(_("Can't create temporary file: %s: %s"), + $tmpcert, $!); + GUI::HELPERS::print_warning($t); + return; + }; + print OUT @key; + close OUT; + } + + # store cacert in temporary location + { + open(IN, "<$opts->{'cafile'}") || do { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning(_("Can't read CA certificate")); + return; + }; + my @cacert = ; + close IN; + + open(OUT, ">$tmpcacert") || do { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning(_("Can't create temporary file")); + return; + }; + print OUT @cacert; + close OUT; + } + + unlink($opts->{'outfile'}); + if($opts->{'format'} eq "ZIP") { + system($main->{'init'}->{'zipbin'}, '-j', $opts->{'outfile'}, + $tmpcacert, $tmpkey, $tmpcert); + my $ret = $? >> 8; + } elsif ($opts->{'format'} eq "TAR") { + system($main->{'init'}->{'tarbin'}, 'cfv', $opts->{'outfile'}, + $tmpcacert, $tmpkey, $tmpcert); + } + + GUI::HELPERS::set_cursor($main, 0); + + if(not -s $opts->{'outfile'} || $ret) { + GUI::HELPERS::print_warning( + sprintf(_("Generating %s file failed"), $opts->{'format'}) + ); + } else { + $main->{'exportdir'} = HELPERS::write_export_dir($main, + $opts->{'outfile'}); + + $t = sprintf( + _("Certificate and Key successfully exported to %s"), + $opts->{'outfile'}); + GUI::HELPERS::print_info($t); + unlink($tmpcacert); + unlink($tmpcert); + unlink($tmpkey); + + return; + } + + } else { + GUI::HELPERS::set_cursor($main, 0); + $t = sprintf(_("Invalid Format for export_cert(): %s"), + $opts->{'format'}); + GUI::HELPERS::print_warning($t); + return; + } + + GUI::HELPERS::set_cursor($main, 0); + + open(OUT, ">$opts->{'outfile'}") || do { + GUI::HELPERS::print_warning(_("Can't open output file: %s: %s"), + $opts->{'outfile'}, $!); + return; + }; + + print OUT $out; + close OUT; + + $main->{'exportdir'} = HELPERS::write_export_dir($main, + $opts->{'outfile'}); + + $t = sprintf(_("Certificate successfully exported to: %s"), + $opts->{'outfile'}); + GUI::HELPERS::print_info($t); + + return; +} + +sub reread_cert { + my ($self, $main, $name) = @_; + + my ($parsed, $tmp); + + GUI::HELPERS::set_cursor($main, 1); + + $name = HELPERS::enc_base64($name); + + $parsed = $self->parse_cert($main, $name, 1); + + # print STDERR "DEBUG: status $parsed->{'STATUS'}\n"; + + foreach(@{$self->{'certlist'}}) { + if(/^$name%/) { + ; #delete + } else { + push(@{$tmp}, $_); + } + } + push(@{$tmp}, $name."%".$parsed->{'STATUS'}); + @{$tmp} = sort(@{$tmp}); + + delete($self->{'certlist'}); + $self->{'certlist'} = $tmp; + + GUI::HELPERS::set_cursor($main, 0); + + return; +} + +sub parse_cert { + my ($self, $main, $name, $force) = @_; + + my($ca, $certfile, $x509, $parsed); + + GUI::HELPERS::set_cursor($main, 1); + + $ca = $main->{'CA'}->{'actca'}; + + if($name eq 'CA') { + $certfile = $main->{'CA'}->{$ca}->{'dir'}."/cacert.pem"; + } else { + $certfile = $main->{'CA'}->{$ca}->{'dir'}."/certs/".$name.".pem"; + } + + $parsed = $self->{'OpenSSL'}->parsecert( + $main->{'CA'}->{$ca}->{'dir'}."/crl/crl.pem", + $main->{'CA'}->{$ca}->{'dir'}."/index.txt", + $certfile, + $force + ); + + GUI::HELPERS::set_cursor($main, 0); + + return($parsed); +} + +1 diff --git a/lib/GUI.pm b/lib/GUI.pm new file mode 100644 index 0000000..3ed2eec --- /dev/null +++ b/lib/GUI.pm @@ -0,0 +1,3105 @@ +# Copyright (c) Stephan Martin +# +# $Id: GUI.pm,v 1.34 2006/07/25 20:10:54 sm Exp $ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + +use strict; +package GUI; + +use POSIX; + +use Gtk2::SimpleMenu; + +my $false=undef; +my $true=1; + +# This hash maps our internal MD names to the displayed digest names. +# Maybe it should live in a crypto-related file instead of a UI-related file? +my %md_algorithms = ( + 'md5' => 'MD5', + 'sha1' => 'SHA1', + 'md2' => 'MD2', + 'mdc2' => 'MDC2', + 'md4' => 'MD4', + 'ripemd160' => 'RIPEMD-160', +# 'sha' => 'SHA', + 'sha1' => 'SHA-1', + ); + +my %bit_lengths = ( + '1024' => '1024', + '2048' => '2048', + '4096' => '4096' + ); + + +# +# create the main object +# +sub new { + my $that = shift; + my $class = ref($that) || $that; + + my $self = {}; + $self->{'init'} = shift; + + bless($self, $class); + + $self->{'version'} = '0.7.5'; + + $self->{'words'} = GUI::WORDS->new(); + + $self->{'exportdir'} = $self->{'init'}->{'exportdir'}; + $self->{'basedir'} = $self->{'init'}->{'basedir'}; + $self->{'tmpdir'} = $self->{'basedir'}."/tmp"; + $self->{'init'}->{'tmpdir'} = $self->{'basedir'}."/tmp"; + + # initialize CA object + $self->{'CA'} = CA->new($self->{'init'}); + + # initialize OpenSSL object + $self->{'OpenSSL'} = OpenSSL->new($self->{'init'}->{'opensslbin'}, + $self->{'tmpdir'}); + + # initialize CERT object + $self->{'CERT'} = CERT->new($self->{'OpenSSL'}); + + # initialize KEY object + $self->{'KEY'} = KEY->new(); + + # initialize REQ object + $self->{'REQ'} = REQ->new($self->{'OpenSSL'}); + + # initialize CONFIG object + $self->{'TCONFIG'} = TCONFIG->new(); + + # initialize fonts and styles + $self->{'fontfix'} = Gtk2::Pango::FontDescription->from_string( + "Courier 10" + ); + +# Gtk::Rc->parse_string( +#'style "default" +#{ +# fontset = "-*-helvetica-medium-r-normal--11-*,-*-fixed-medium-r-normal--11-*" +#} +#widget_class "*" style "default"'); + +# $self->{'stylered'} = Gtk2::Style->new(); +# $self->{'stylered'}->fg('normal', Gtk2::Gdk::Color->parse('red')); + +# $self->{'stylegreen'} = Gtk2::Style->new(); +# $self->{'stylegreen'}->fg('normal', Gtk2::Gdk::Color->parse('green')); + + # initialize main window + $self->{'mw'} = Gtk2::Window->new("toplevel"); + $self->{'mw'}->set_title("TinyCA2 Management $self->{'version'}"); + + $self->{'mw'}->set_resizable(1); + $self->{'mw'}->set_default_size(850, 600); + $self->{'mw'}->signal_connect( 'delete_event', + sub { HELPERS::exit_clean(0) }); + + $self->{'busycursor'} = Gtk2::Gdk::Cursor->new('watch'); + $self->{'cursor'} = Gtk2::Gdk::Cursor->new('left-ptr'); + $self->{'rootwin'} = Gtk2::Gdk->get_default_root_window(); + + # split window horizontal to add menu, toolbar and notebook + $self->{'mvb'} = Gtk2::VBox->new(); + $self->{'mw'}->add($self->{'mvb'}); + + $self->create_menu(); + $self->{'mvb'}->pack_start($self->{'menu'}->{'widget'} , 0, 0, 0); + + $self->create_toolbar('startup'); + $self->{'mvb'}->pack_start($self->{'toolbar'}, 0, 0, 0); + + $self->create_nb(); + $self->{'sizebox'} = Gtk2::VBox->new(); + $self->{'mvb'}->pack_start($self->{'sizebox'}, 1, 1, 0); + $self->{'sizebox'}->pack_start($self->{'nb'}, 1, 1, 0); + + $self->create_bar(); + $self->{'mvb'}->pack_start($self->{'barbox'}, 0, 0, 0); + + $self->{'rootwin'}->set_cursor($self->{'cursor'}); + + $self; +} + +# +# create/update the main frame with the notebooks +# +sub create_mframe { + my ($self, $force) = @_; + + my($parsed, $calabel, $caframe, $rows, $table, @fields, $text, @childs, + $label, $cert_export, $cert_revoke, $cert_delete, $certlabel, + $certlistwin, @certtitles, @keytitles, $keylabel, $keylistwin, + $reqlistwin, @reqtitles, $reqlabel, $ind, $column, $ca, $cadir); + + if ((defined($self->{'CA'}->{'actca'})) && + ($self->{'CA'}->{'actca'} ne "")) { + $ca = $self->{'CA'}->{'actca'}; + } else { + return; + } + + $cadir = $self->{'CA'}->{'cadir'}; + + $parsed = $self->{'CERT'}->parse_cert( $self, 'CA'); + + defined($parsed) || + GUI::HELPERS::print_error( _("Can't read CA certificate")); + + ### notebooktab for ca information + if(not defined($self->{'cabox'})) { + $self->{'cabox'} = Gtk2::VBox->new(0, 0); + $calabel = GUI::HELPERS::create_label(_("CA"), 'left', 1, 0); + $self->{'nb'}->insert_page($self->{'cabox'}, $calabel, 0); + } else { + $self->{'nb'}->hide(); + $self->{'nb'}->remove_page(0); + $self->{'cabox'}->destroy(); + $self->{'cabox'} = Gtk2::VBox->new(0, 0); + $calabel = GUI::HELPERS::create_label(_("CA"), 'left', 1, 0); + $self->{'nb'}->insert_page($self->{'cabox'}, $calabel, 0); + } + + # frame for CA informations + $self->{'cainfobox'} = GUI::X509_infobox->new(); + $self->{'cainfobox'}->display($self->{'cabox'}, $parsed, 'cacert', + _("CA Information")); + + ### notebooktab for certificates + + # delete old instance, force reinitialisation + if (defined($self->{'certbox'}) && $force) { + $self->{'certbox'}->destroy(); + delete($self->{'certbox'}); + $self->{'certbox'} = undef; + delete($self->{'certbrowser'}->{'OpenSSL'}); + $self->{'certbrowser'}->{'OpenSSL'} = undef; + delete($self->{'certbrowser'}); + $self->{'certbrowser'} = undef; + } + + if(not defined($self->{'certbox'})) { + $self->{'certbox'} = Gtk2::VBox->new(0, 0); + + $certlabel = GUI::HELPERS::create_label( + _("Certificates"), 'left', 1, 0); + $self->{'nb'}->insert_page($self->{'certbox'}, $certlabel, 1); + + if (not defined ($self->{'certbrowser'})) { + $self->{'certbrowser'}=GUI::X509_browser->new($self, 'cert'); + $self->{'certbrowser'}->set_window($self->{'certbox'}); + $self->{'certbrowser'}->add_list($ca, + $cadir."/certs", + $cadir."/crl/crl.pem", + $cadir."/index.txt"); + + $self->{'certbrowser'}->add_info(); + + # create popup menu + if(not defined($self->{'certmenu'})) { + _create_cert_menu($self); + } + + $self->{'certbrowser'}->{'x509clist'}->signal_connect( + 'button_release_event', + sub { _show_popup_menu($self, 'cert', @_) }); + $self->{'certbrowser'}->{'x509clist'}->signal_connect( + 'button_press_event', + sub { _show_details_wrapper($self, 'cert', @_)}); + + # $self->{'certbrowser'}->destroy(); + } else { + $self->{'certbrowser'}->update($cadir."/certs", + $cadir."/crl/crl.pem", + $cadir."/index.txt"); + } + + } else { + $self->{'certbrowser'}->update($cadir."/certs", + $cadir."/crl/crl.pem", + $cadir."/index.txt"); + } + + + ### notebooktab for keys (split info and buttons) + @keytitles = (_("Common Name"), + _("eMail Address"), + _("Organizational Unit"), + _("Organization"), + _("Location"), + _("State"), + _("Country"), + _("Type")); + # delete old instance, force reinitialisation + if (defined($self->{'keybox'}) && $force) { + $self->{'keybox'}->destroy(); + delete($self->{'keybox'}); + $self->{'keybox'} = undef; + delete($self->{'keybrowser'}->{'OpenSSL'}); + $self->{'keybrowser'}->{'OpenSSL'} = undef; + delete($self->{'keybrowser'}); + $self->{'keybrowser'} = undef; + } + + if(not defined($self->{'keybox'})) { + $self->{'keybox'} = Gtk2::VBox->new(0, 0); + $keylabel = GUI::HELPERS::create_label( _("Keys"), 'left', 1, 0); + $self->{'nb'}->insert_page($self->{'keybox'}, $keylabel, 2); + + if (not defined ($self->{'keybrowser'})) { + $self->{'keybrowser'}=GUI::X509_browser->new($self, 'key'); + $self->{'keybrowser'}->set_window($self->{'keybox'}); + $self->{'keybrowser'}->add_list($ca, + $cadir."/keys", + $cadir."/crl/crl.pem", + $cadir."/index.txt"); + + # create popup menu + if(not defined($self->{'keymenu'})) { + _create_key_menu($self); + } + + $self->{'keybrowser'}->{'x509clist'}->signal_connect( + 'button_release_event', + sub { _show_popup_menu($self, 'key', @_) }); + + } else { + $self->{'keybrowser'}->update($cadir."/keys", + $cadir."/crl/crl.pem", + $cadir."/index.txt"); + } + + } + + # delete old instance, force reinitialisation + if (defined($self->{'reqbox'}) && $force) { + $self->{'reqbox'}->destroy(); + delete($self->{'reqbox'}); + $self->{'reqbox'} = undef; + delete($self->{'reqbrowser'}->{'OpenSSL'}); + $self->{'reqbrowser'}->{'OpenSSL'} = undef; + delete($self->{'reqbrowser'}); + $self->{'reqbrowser'} = undef; + } + + ### notebooktab for requests (split info and buttons) + if(not defined($self->{'reqbox'})) { + $self->{'reqbox'} = Gtk2::VBox->new(0, 0); + $reqlabel = GUI::HELPERS::create_label( + _("Requests"), 'left', 1, 0); + $self->{'nb'}->insert_page($self->{'reqbox'}, $reqlabel, 3); + + if (not defined ($self->{'reqbrowser'})) { + $self->{'reqbrowser'}=GUI::X509_browser->new($self, 'req'); + $self->{'reqbrowser'}->set_window($self->{'reqbox'}); + $self->{'reqbrowser'}->add_list($ca, + $cadir."/req", + $cadir."/crl/crl.pem", + $cadir."/index.txt"); + + $self->{'reqbrowser'}->add_info(); + + # create popup menu + if(not defined($self->{'reqmenu'})) { + _create_req_menu($self); + } + + $self->{'reqbrowser'}->{'x509clist'}->signal_connect( + 'button_release_event', + sub { _show_popup_menu($self, 'req', @_) }); + + $self->{'reqbrowser'}->{'x509clist'}->signal_connect( + 'button_press_event', + sub { _show_details_wrapper($self, 'req', @_)}); + + } else { + $self->{'reqbrowser'}->update($cadir."/req", + $cadir."/crl/crl.pem", + $cadir."/index.txt"); + } + + } else { + $self->{'reqbrowser'}->update($cadir."/req", + $cadir."/crl/crl.pem", + $cadir."/index.txt"); + } + + $self->{'nb'}->show_all(); + $self->{'nb'}->signal_connect_after('switch-page' => + sub { _act_toolbar($self->{'nb'}, $self) }); + + $self->{'nb'}->set_current_page(1); + + return; +} + +# +# create empty notebook, add to main window and configure +# +sub create_nb { + my $self = shift; + + $self->{'nb'} = Gtk2::Notebook->new(); + $self->{'nb'}->set_tab_pos('top'); + + return; +} + +# +# create the applicationbar +# +sub create_bar { + my $self = shift; + + $self->{'barbox'} = Gtk2::HBox->new(); + $self->{'bar'} = Gtk2::Statusbar->new(); + + $self->{'progress'} = Gtk2::ProgressBar->new(); + + $self->{'barbox'}->pack_start($self->{'bar'}, 1, 1, 0); + + GUI::HELPERS::set_status($self, " Watch out..."); + + return; +} + +# +# keep toolbar in sync with notebook +# +sub _act_toolbar { + my ($nb, $self) = @_; + + my $page_num = $nb->get_current_page(); + + my $mode = 'startup'; + my $t; + + if(defined($self->{'CA'}->{'actca'})) { + if ($page_num == 0) { + $mode = 'ca'; + $t = _(" Actual CA: %s"); + } elsif ($page_num == 1) { + $mode = 'cert'; + $t = _(" Actual CA: %s - Certificates"); + } elsif ($page_num == 2) { + $mode = 'key'; + $t = _(" Actual CA: %s - Keys"); + } elsif ($page_num == 3) { + $mode = 'req'; + $t = _(" Actual CA: %s - Requests"); + } + + if(defined($self->{'CA'}->{'actca'})) { + $t = sprintf($t, $self->{'CA'}->{'actca'}); + GUI::HELPERS::set_status($self, $t); + } + } + + $self->create_toolbar($mode); +} + +# +# create the toolbar +# +sub create_toolbar { + my ($self, $mode) = @_; + + my ($icon, $mask, $iconw, $button, @children, $c, $ca); + + $ca = $self->{'CA'}->{'actca'}; + + if(not defined($self->{'separator'})) { + $self->{'separator'} = Gtk2::SeparatorToolItem->new(); + } + + if(defined($self->{'toolbar'})) { + @children = $self->{'toolbar'}->get_children(); + + for(my $i = 6; $i < @children; $i++) { + $c = $children[$i]; + $c->destroy(); + } + } else { + $self->{'toolbar'} = Gtk2::Toolbar->new(); + $self->{'toolbar'}->set_orientation('horizontal'); + $self->{'toolbar'}->set_icon_size('small-toolbar'); + + ## Buttons for all toolbars + $self->{'toolbar'} = Gtk2::Toolbar->new(); + $self->{'toolbar'}->set_orientation('horizontal'); + + $button = Gtk2::ToolButton->new_from_stock('gtk-quit'); + $self->{'toolbar'}->insert($button, -1); + $button->signal_connect('clicked', sub { exit(4) }); + + + $button = Gtk2::ToolButton->new_from_stock('gtk-open'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Open CA")); + $button->signal_connect('clicked', sub { + $self->{'CA'}->get_open_name($self)}); + + $button = Gtk2::ToolButton->new_from_stock('gtk-new'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("New CA")); + $button->signal_connect('clicked', sub { + $self->{'CA'}->get_ca_create($self)}); + + $button = Gtk2::ToolButton->new_from_stock('gtk-convert'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Import CA")); + $button->signal_connect('clicked', sub { + $self->{'CA'}->get_ca_import($self)}); + + $button = Gtk2::ToolButton->new_from_stock('gtk-delete'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Delete CA")); + $button->signal_connect('clicked', sub { + $self->{'CA'}->get_ca_delete($self)}); + + $self->{'toolbar'}->insert($self->{'separator'}, -1); } + + + if($mode eq 'ca') { + $button = Gtk2::ToolButton->new_from_stock('gtk-find'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Details")); + $button->signal_connect('clicked', sub { + $self->show_details('CA') }); + + $button = Gtk2::ToolButton->new_from_stock('gtk-find-and-replace'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("History")); + $button->signal_connect('clicked', sub { + $self->show_history() }); + + $button = Gtk2::ToolButton->new_from_stock('gtk-new'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Sub CA")); + $button->signal_connect('clicked', sub { + $self->{'CA'}->get_ca_create($self, undef, undef, "sub")}); + + $button = Gtk2::ToolButton->new_from_stock('gtk-save'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Export CA")); + $button->signal_connect('clicked', sub { + $self->{'CA'}->export_ca_cert($self)}); + + $button = Gtk2::ToolButton->new_from_stock('gtk-save'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Export CRL")); + $button->signal_connect('clicked', sub { + $self->{'CA'}->export_crl($self)}); + + if(-s $self->{'CA'}->{$ca}->{'dir'}."/cachain.pem") { + $button = Gtk2::ToolButton->new_from_stock('gtk-save'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Export Chain")); + $button->signal_connect('clicked', sub { + $self->{'CA'}->export_ca_chain($self)}); + } + + } elsif($mode eq 'cert') { + $button = Gtk2::ToolButton->new_from_stock('gtk-find'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Details")); + $button->signal_connect('clicked', sub { + $self->show_details('cert') }); + + $button = Gtk2::ToolButton->new_from_stock('gtk-find'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("View")); + $button->signal_connect('clicked', sub { + $self->show_text('cert') }); + + if(not(defined($self->{'newcertmenu'}))) { + _create_create_cert_menu($self); + } + + $button = Gtk2::ToolButton->new_from_stock('gtk-new'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("New")); + $button->signal_connect('clicked' => + sub { $self->{'newcertmenu'}->popup( + undef, undef, undef, undef, 1, 0) }); + + $button = Gtk2::ToolButton->new_from_stock('gtk-save'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Export")); + $button->signal_connect('clicked', sub { + $self->{'CERT'}->get_export_cert($self) }); + + $button = Gtk2::ToolButton->new_from_stock('gtk-stop'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Revoke")); + $button->signal_connect('clicked', sub { + $self->{'CERT'}->get_revoke_cert($self) }); + + if(not defined($self->{'renewcertmenu'})) { + _create_renew_cert_menu($self); + } + + $button = Gtk2::ToolButton->new_from_stock('gtk-refresh'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Renew")); + $button->signal_connect('clicked' => + sub { $self->{'renewcertmenu'}->popup( + undef, undef, undef, undef, 1, 0) }); + + $button = Gtk2::ToolButton->new_from_stock('gtk-delete'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Delete")); + $button->signal_connect('clicked', sub { + $self->{'CERT'}->get_del_cert($self) }); + + } elsif($mode eq 'key') { + + $button = Gtk2::ToolButton->new_from_stock('gtk-save'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Export")); + $button->signal_connect('clicked', sub { + $self->{'KEY'}->get_export_key($self) }); + + $button = Gtk2::ToolButton->new_from_stock('gtk-delete'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Delete")); + $button->signal_connect('clicked', sub { + $self->{'KEY'}->get_del_key($self) }); + + } elsif($mode eq 'req') { + + $button = Gtk2::ToolButton->new_from_stock('gtk-find'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Details")); + $button->signal_connect('clicked', sub { + $self->show_details('req') }); + + $button = Gtk2::ToolButton->new_from_stock('gtk-find'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("View")); + $button->signal_connect('clicked', sub { + $self->show_text('req') }); + + $button = Gtk2::ToolButton->new_from_stock('gtk-new'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("New")); + $button->signal_connect('clicked', sub { + $self->{'REQ'}->get_req_create($self) }); + + $button = Gtk2::ToolButton->new_from_stock('gtk-revert-to-saved'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Import")); + $button->signal_connect('clicked', sub { + $self->{'REQ'}->get_import_req($self) }); + + if(not(defined($self->{'reqsignmenu'}))) { + _create_sign_req_menu($self); + } + + $button = Gtk2::ToolButton->new_from_stock('gtk-properties'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Sign")); + $button->signal_connect('clicked' => + sub { $self->{'reqsignmenu'}->popup( + undef, undef, undef, undef, 1, 0) }); + + $button = Gtk2::ToolButton->new_from_stock('gtk-delete'); + $self->{'toolbar'}->insert($button, -1); + $button->set_label(_("Delete")); + $button->signal_connect('clicked', sub { + $self->{'REQ'}->get_del_req($self) }); + } + + $self->{'toolbar'}->set_icon_size('small-toolbar'); + + $self->{'toolbar'}->show_all(); + + return; +} + +# +# create the menubar +# +sub create_menu { + my $self = shift; + + my $menu_tree = [ + _("_CA") => { + item_type => '', + children => [ + _("_Open CA") => { + callback => sub { $self->{'CA'}->get_open_name($self) }, + item_type => '', + extra_data => 'gtk-open' + }, + _("_New CA") => { + callback => sub { $self->{'CA'}->get_ca_create($self)}, + item_type => '', + extra_data => 'gtk-new' + }, + _("_Delete CA") => { + callback => sub { $self->{'CA'}->get_ca_delete($self)}, + item_type => '', + extra_data => 'gtk-delete' + }, + Separator => { + item_type => '', + }, + _("_Exit") => { + callback => sub { exit(3) }, + item_type => '', + extra_data => 'gtk-close' + } + ], + }, + _("_Preferences") => { + item_type => '', + children => [ + _("Experts Only!!") => { + }, + Separator => { + item_type => '', + }, + _("OpenSSL _Configuration") => { + callback => sub{ $self->{'TCONFIG'}->config_openssl($self) }, + item_type => '', + extra_data => 'gtk-preferences' + } + ], + }, + _("_Help") => { + item_type => '', + children => [ + _("_Help") => { + callback => sub{ $self->show_help() }, + item_type => '', + extra_data => 'gtk-help' + }, + _("_About TinyCA") => { + callback => sub { $self->about($self) }, + item_type => '', + extra_data => 'gtk-about' + } + ], + } + ]; + + $self->{'menu'} = Gtk2::SimpleMenu->new(menu_tree => $menu_tree); + + return; +} + +# +# pop-up to display request/cert as TXT +# +sub show_text { + my ($self, $mode) = @_; + + my($parsed, $t, $box, $label, $text, $vscrollbar, $name, $button_ok, + $status, $scrolled, $ca, $buffer); + + $ca = $self->{'CA'}->{'actca'}; + + if($mode eq 'req') { + $name = $self->{'reqbrowser'}->selection_dn(); + } elsif($mode eq 'cert') { + $name = $self->{'certbrowser'}->selection_dn(); + } else { + GUI::HELPERS::print_error( + _("Invalid mode for show_text():")." ".$mode); + return; + } + + if((not defined $name) && ($mode eq 'req')) { + GUI::HELPERS::print_info(_("Please select a Request first")); + return; + }elsif((not defined $name) && ($mode eq 'cert')) { + GUI::HELPERS::print_info(_("Please select a certificate first")); + return; + } + + if($mode eq 'cert') { + $status = $self->{'certbrowser'}->selection_status(); + } + + $name = HELPERS::enc_base64($name); + + if($mode eq 'req') { + $parsed = $self->{'REQ'}->parse_req( $self, $name); + } elsif($mode eq 'cert') { + $parsed = $self->{'CERT'}->parse_cert( $self, $name); + } + + defined($parsed) || GUI::HELPERS::print_error(_("Can't read file")); + + $t = $mode eq 'req'?_("Request"):_("Certificate"); + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + $button_ok->signal_connect('clicked', sub { $box->destroy() }); + $button_ok->can_default(1); + + $box = GUI::HELPERS::dialog_box($t, $t, $button_ok); + + $box->set_default_size(550, 440); + $button_ok->grab_default(); + + $scrolled = Gtk2::ScrolledWindow->new(undef, undef); + $scrolled->set_policy('automatic', 'automatic'); + $scrolled->set_shadow_type('etched-in'); + $box->vbox->pack_start($scrolled, 1, 1, 0); + + $buffer = Gtk2::TextBuffer->new(); + $buffer->set_text($parsed->{'TEXT'}); + + $text = Gtk2::TextView->new_with_buffer($buffer); + $text->set_editable(0); + $text->set_wrap_mode('none'); + + $text->modify_font($self->{'fontfix'}); + + $scrolled->add($text); + + $box->show_all(); + return; +} + +# +# completeley sick, but needed for doubleclick +# +sub _show_details_wrapper { + my ($self, $mode, $list, $event) = @_; + + return(0) if($event->type() ne '2button-press'); + + show_details($self, $mode); + + return(1); +} + +# +# called on rightclick in [key|cert|reqlist] +# +sub _show_popup_menu { + my ($self, $mode, $list, $event) = @_; + + my $t; + + if ($event->button() == 3) { + if($mode eq 'cert') { + $self->{'certmenu'}->popup(undef, undef, undef, undef, 3, 0); + } elsif ($mode eq 'req') { + $self->{'reqmenu'}->popup(undef, undef, undef, undef, 3, 0); + } elsif ($mode eq 'key') { + $self->{'keymenu'}->popup(undef, undef, undef, undef, 3, 0); + } else { + $t = sprintf( + _("Invalid mode for _show_popup_menu(): %s"), $mode); + GUI::HELPERS::print_error($t); + } + return(1); + } + + return(0); +} + +# +# show request/certificate informations and extensions +# +sub show_details { + my ($self, $mode) = @_; + + my($name, $status, $parsed, $row, $ind, $label, $table, $tree, $box, + $button_ok, $t, @fields, $ca); + + $ca = $self->{'CA'}->{'actca'}; + + if($mode eq 'req') { + $name = $self->{'reqbrowser'}->selection_dn(); + } elsif($mode eq 'cert') { + $name = $self->{'certbrowser'}->selection_dn(); + } elsif($mode eq 'CA') { + $name = 'CA'; + } else { + GUI::HELPERS::print_error( + _("Invalid mode for show_details():")." ".$mode); + return; + } + + if((not defined $name) && ($mode eq 'req')) { + GUI::HELPERS::print_info(_("Please select a Request first")); + return; + }elsif((not defined $name) && ($mode eq 'cert')) { + GUI::HELPERS::print_info(_("Please select a Certificate first")); + return; + } + + if($mode eq 'cert') { + $status = $self->{'certbrowser'}->selection_status(); + } + + $name = HELPERS::enc_base64($name) if($name ne 'CA'); + + if($mode eq 'req') { + $parsed = $self->{'REQ'}->parse_req( $self, $name); + } elsif($mode eq 'cert' || $mode eq 'CA') { + $parsed = $self->{'CERT'}->parse_cert( $self, $name); + } + + defined($parsed) || GUI::HELPERS::print_error(_("Can't read file")); + + $t = $mode eq 'req'?_("Request Details"):_("Certificate Details"); + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + $button_ok->can_default(1); + $button_ok->signal_connect('clicked', sub { $box->destroy() }); + + $box = GUI::HELPERS::dialog_box($t, $t, $button_ok); + $box->set_default_size(700, 400); + + $button_ok->grab_default(); + + $mode = 'cert' if($mode eq 'CA'); + + $tree = $self->create_detail_tree($parsed, $mode); + $box->vbox->add($tree); + + $box->show_all(); + $tree->{'tree'}->columns_autosize(); +} + +# +# pop-up to verify import +# +sub show_import_verification { + my ($self, $mode, $opts, $parsed) = @_; + + my($box, $button_ok, $button_cancel, $label, $rows, $tree, $t); + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + $button_ok->can_default(1); + if($mode eq "req") { + $button_ok->signal_connect('clicked', + sub { $self->{'REQ'}->import_req($self, $opts, $parsed, $box) }); + } elsif($mode eq "cacert") { + $button_ok->signal_connect('clicked', + sub { $self->{'CA'}->import_ca($self, $opts, $box) }); + } + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect('clicked', sub { $box->destroy() }); + + if($mode eq "req") { + $t = _("Import Request"); + } elsif($mode eq "cacert") { + $t = _("Import CA Certificate"); + } + $box = GUI::HELPERS::dialog_box( $t, $t, $button_ok, $button_cancel); + $box->set_default_size(700, 400); + + $button_ok->grab_default(); + + if($mode eq "req") { + $t = _("Do you want to import the following Certificate Request?"); + } elsif($mode eq "cacert") { + $t = _("Do you want to import the following CA Certificate?"); + } + $label = GUI::HELPERS::create_label($t, 'center', 1, 0); + $box->vbox->pack_start($label, 0, 0, 0); + + $tree = $self->create_detail_tree($parsed, $mode); + $box->vbox->pack_start($tree, 1, 1, 0); + + $box->show_all(); + + return; +} + +# +# create tree with details (cert/req) +# +sub create_detail_tree { + my ($self, $parsed, $mode) = @_; + + # print STDERR "DEBUG: create_detail_tree called with mode $mode\n"; + + my ($tree, $tree_scrolled, $t, $root, $store, $piter, $citer, $column, + $ind, $nsext); + + $tree_scrolled = Gtk2::ScrolledWindow->new(undef, undef); + $tree_scrolled->set_policy('automatic', 'automatic'); + $tree_scrolled->set_shadow_type('etched-in'); + + $store = Gtk2::TreeStore->new('Glib::String','Glib::String'); + $tree = Gtk2::TreeView->new_with_model($store); + $tree->get_selection->set_mode('none'); + $tree->set_headers_visible(0); + + $tree_scrolled->{'tree'} = $tree; + + my @titles = ("", ""); + $ind = 0; + foreach my $title (@titles) { + $column = Gtk2::TreeViewColumn->new_with_attributes( + $title, Gtk2::CellRendererText->new(), 'text' => $ind); + $tree->append_column($column); + $ind++; + } + + $tree_scrolled->add_with_viewport($tree); + + $t = $mode eq 'req'?_("Request Details"):_("Certificate Details"); + $t .= " - $parsed->{'CN'}"; + + $root = $store->append(undef); + $store->set($root, 0 => $t); + + # Information about Subject DN + + $t = _("Subject DN").":"; + $piter = $store->append($root); + $store->set($piter, 0 => $t); + + for my $l qw(CN EMAIL O OU C ST L) { + if(defined($parsed->{$l})) { + if($l eq "OU") { + foreach my $ou (@{$parsed->{'OU'}}) { + $citer = $store->append($piter); + $store->set($citer, + 0 => $self->{'words'}{$l}, + 1 => $ou); + } + } else { + $citer = $store->append($piter); + $store->set($citer, + 0 => $self->{'words'}{$l}, + 1 => $parsed->{$l}); + } + } + } + + if($mode ne "req") { + # Information about Issuer + $t = _("Issuer").":"; + + $piter = $store->append($root); + $store->set($piter, 0 => $t); + + for my $l qw(CN EMAIL O OU C ST L) { + if(defined($parsed->{'ISSUERDN'}->{$l})) { + if($l eq "OU") { + foreach my $ou (@{$parsed->{'ISSUERDN'}->{'OU'}}) { + $citer = $store->append($piter); + $store->set($citer, + 0 => $self->{'words'}{$l}, + 1 => $ou); + } + } else { + $citer = $store->append($piter); + $store->set($citer, + 0 => $self->{'words'}{$l}, + 1 => $parsed->{'ISSUERDN'}->{$l}); + } + } + } + } + + if($mode ne "req") { + # Information about Validity + $t = _("Validity").":"; + + $piter = $store->append($root); + $store->set($piter, 0 => $t); + + for my $l qw(STATUS NOTBEFORE NOTAFTER) { + if(defined($parsed->{$l})) { + $citer = $store->append($piter); + $store->set($citer, + 0 => $self->{'words'}{$l}, + 1 => $parsed->{$l}); + } + } + } + + # Information about Key/Certificate + $t = $mode eq 'req'?_("Key/Request Details:"):_("Key/Certificate Details:"); + $piter = $store->append($root); + $store->set($piter, 0 => $t); + + + for my $l qw(STATUS SERIAL KEYSIZE PK_ALGORITHM SIG_ALGORITHM TYPE) { + if(defined($parsed->{$l})) { + $citer = $store->append($piter); + $store->set($citer, + 0 => $self->{'words'}{$l}, + 1 => $parsed->{$l}); + } + } + + if($mode ne "req") { + # Fingerprints + $t = _("Fingerprints").":"; + $piter = $store->append($root); + $store->set($piter, 0 => $t); + + for my $l qw(FINGERPRINTMD5 FINGERPRINTSHA1) { + if(defined($parsed->{$l})) { + $citer = $store->append($piter); + $store->set($citer, + 0 => $self->{'words'}{$l}, + 1 => $parsed->{$l}); + } + } + } + + # Information about Key/Certificate + if(keys(%{$parsed->{'EXT'}})) { + $t = $mode eq 'req'?_("Requested X.509 Extensions"):_("X.509v3 Extensions"); + $piter = $store->append($root); + $store->set($piter, 0 => $t); + + while(my ($key, $val) = each(%{$parsed->{'EXT'}})) { + if($key =~ /^netscape/i) { + $nsext = 1; next; + } + # print STDERR "DEBUG: print key: >$key< val: >$val->[0]<\n"; + $citer = $store->append($piter); + $store->set($citer, + 0 => $key, + 1 => $val->[0]); + + if(@{$val} > 1) { + for(my $i = 1; $val->[$i]; $i++) { + $citer = $store->append($piter); + $store->set($citer, + 0 => $key, + 1 => $val->[$i]); + } + } + } + + if($nsext) { + $t = $mode eq 'req'?_("Requested Netscape Extensions"):_("Netscape Extensions"); + $piter = $store->append($root); + $store->set($piter, 0 => $t); + + while(my ($key, $val) = each(%{$parsed->{'EXT'}})) { + if($key !~ /^netscape/i) { + next; + } + $citer = $store->append($piter); + $store->set($citer, + 0 => $key, + 1 => $val->[0]); + + if(@{$val} > 1) { + for(my $i = 1; $val->[$i]; $i++) { + $t = [$key, $val->[$i]]; + $citer = $store->append($piter); + $store->set($citer, + 0 => $key, + 1 => $val->[$i]); + } + } + } + } + } + $tree->expand_to_path(Gtk2::TreePath->new_first()); + + return($tree_scrolled); +} + + +# +# get name for open/delete a CA +# +sub show_select_ca_dialog { + my ($self, $action, $opts)= @_; + + my ($box, $button_ok, $button_cancel, $label, $scrolled, $list, + $model, $name, $t, $store, $column, $iter); + + if($action eq 'open') { + $t = _("Open CA"); + }elsif($action eq 'delete') { + $t = _("Delete CA"); + }else { + GUI::HELPERS::print_error(_("Invalid action given: ").$action); + return; + } + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + $button_ok->can_default(1); + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect('clicked', sub { $box->destroy() }); + + $button_ok->signal_connect('clicked', + sub { + $iter = $list->get_selection->get_selected(); + if(defined($iter)) { + $name = $store->get($iter); + if($action eq 'open') { + $opts->{'name'} = $name; + $self->{'CA'}->open_ca($self, $opts, $box); + }elsif($action eq 'delete') { + $self->{'CA'}->delete_ca($self, $name, $box); + }else { + GUI::HELPERS::print_error( + _("Invalid action for show_select_ca_dialog(): ").$action); + } + } + } + ); + + $box = GUI::HELPERS::dialog_box($t, $t, $button_ok, $button_cancel); + + $button_ok->grab_default(); + + $scrolled = Gtk2::ScrolledWindow->new(undef, undef); + $scrolled->set_policy('automatic', 'automatic' ); + $scrolled->set_shadow_type('etched-in'); + $box->vbox->add($scrolled); + + $store = Gtk2::ListStore->new('Glib::String'); + + $list = Gtk2::TreeView->new_with_model ($store); + $list->get_selection->set_mode('single'); + $scrolled->add_with_viewport($list); + + $column = Gtk2::TreeViewColumn->new_with_attributes( + _("Available CAs"), Gtk2::CellRendererText->new(), 'text' => 0); + $list->append_column($column); + + foreach(@{$self->{'CA'}->{'calist'}}) { + next if (not defined $_ ); + $iter = $store->append(); + $store->set($iter, 0, $_); + } + + # activate doubleclick in the list + $list->signal_connect('button_press_event', + sub { + if($_[1]->type() eq '2button-press') { + $iter = $list->get_selection->get_selected(); + if($iter) { + $name = $store->get($iter); + + if($action eq 'open') { + $opts->{'name'} = $name; + $self->{'CA'}->open_ca($self, $opts, $box); + }elsif($action eq 'delete') { + $self->{'CA'}->delete_ca($self, $name, $box); + }else { + GUI::HELPERS::print_error( + _("Invalid action for show_select_ca_dialog(): ").$action); + } + } + return(1); + } + return(0); + } + ); + + $button_ok->grab_default(); + + $box->show_all(); +} + +# +# get data for creating a new request +# +sub show_req_dialog { + my ($self, $opts) = @_; + + my ($box, $button_ok, $button_cancel, $reqtable, $radiobox, $key1, $key2, + $key3, $key4, $key5, $entry, $label); + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + $button_ok->can_default(1); + $button_ok->signal_connect('clicked', + sub { $self->{'REQ'}->get_req_create($self, $opts, $box) }); + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect('clicked', sub { $box->destroy() }); + + $box = GUI::HELPERS::dialog_box( + _("Create Request"), + _("Create a new Certificate Request"), + $button_ok, $button_cancel); + + # table for request data + my $cc=0; + my $ous = 1; + if(defined($opts->{'OU'})) { + $ous = @{$opts->{'OU'}} - 1; + } + $reqtable = Gtk2::Table->new(1, 13 + $ous, 0); + $reqtable->set_col_spacing(0, 7); + $box->vbox->add($reqtable); + + $entry = GUI::HELPERS::entry_to_table( + _("Common Name (eg, your Name,"), + \$opts->{'CN'}, $reqtable, 0, 1); + $entry->grab_focus(); + + $label = GUI::HELPERS::create_label( + _("your eMail Address"), 'right', 0, 0); + $reqtable->attach_defaults($label, 0, 1, 2, 3); + + $label = GUI::HELPERS::create_label( + _("or the Servers Name)"), 'right', 0, 0); + $reqtable->attach_defaults($label, 0, 1, 3, 4); + + $entry = GUI::HELPERS::entry_to_table( + _("eMail Address").":", + \$opts->{'EMAIL'}, $reqtable, 4, 1); + + $entry = GUI::HELPERS::entry_to_table( + _("Password (protect your private Key):"), + \$opts->{'passwd'}, $reqtable, 5, 0); + + $entry = GUI::HELPERS::entry_to_table( + _("Password (confirmation):"), + \$opts->{'passwd2'}, $reqtable, 6, 0); + + $entry = GUI::HELPERS::entry_to_table( + _("Country Name (2 letter code):"), + \$opts->{'C'}, $reqtable, 7, 1); + + $entry = GUI::HELPERS::entry_to_table( + _("State or Province Name:"), + \$opts->{'ST'}, $reqtable, 8, 1); + + $entry = GUI::HELPERS::entry_to_table( + _("Locality Name (eg. city):"), + \$opts->{'L'}, $reqtable, 9, 1); + + $entry = GUI::HELPERS::entry_to_table( + _("Organization Name (eg. company):"), + \$opts->{'O'}, $reqtable, 10, 1); + + if(defined($opts->{'OU'})) { + foreach my $ou (@{$opts->{'OU'}}) { + $entry = GUI::HELPERS::entry_to_table( + _("Organizational Unit Name (eg. section):"), + \$ou, $reqtable, 11 + $cc++, 1); + } + } else { + $entry = GUI::HELPERS::entry_to_table( + _("Organizational Unit Name (eg. section):"), + \$opts->{'OU'}, $reqtable, 11, 1); + } + + $label = GUI::HELPERS::create_label( + _("Keylength").":", 'left', 0, 0); + $reqtable->attach_defaults($label, 0, 1, 13, 14); + + $radiobox = Gtk2::HBox->new(0, 0); + _fill_radiobox($radiobox, \$opts->{'bits'}, %bit_lengths); + $reqtable->attach_defaults($radiobox, 1, 2, 13, 14); + + $label = GUI::HELPERS::create_label( + _("Digest").":", 'left', 0, 0); + $reqtable->attach_defaults($label, 0, 1, 15, 16); + + $radiobox = Gtk2::HBox->new(0, 0); + _fill_radiobox($radiobox, \$opts->{'digest'}, %md_algorithms); + $reqtable->attach_defaults($radiobox, 1, 2, 15, 16); + + $label = GUI::HELPERS::create_label(_("Algorithm").":", 'left', 0, 0); + $reqtable->attach_defaults($label, 0, 1, 16, 17); + + $radiobox = Gtk2::HBox->new(0, 0); + _fill_radiobox($radiobox, \$opts->{'algo'}, + 'rsa' => 'RSA', + 'dsa' => 'DSA'); + $reqtable->attach_defaults($radiobox, 1, 2, 16, 17); + + $box->show_all(); + + return; +} + +# +# get data for revoking a certificate +# +sub show_cert_revoke_dialog { + my ($self, $opts) = @_; + + my ($box, $button_ok, $button_cancel, $table, $entry, $t, $label, $combo, + @combostrings); + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + $button_ok->signal_connect('clicked', + sub { $self->{'CERT'}->get_revoke_cert($self, $opts, $box) }); + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect('clicked', sub { $box->destroy() }); + + $box = GUI::HELPERS::dialog_box( + _("Revoke Certificate"), _("Revoke Certificate"), + $button_ok, $button_cancel); + + # small table for data + $table = Gtk2::Table->new(1, 2, 0); + $table->set_col_spacing(0, 10); + $box->vbox->add($table); + + $entry = GUI::HELPERS::entry_to_table( + _("CA Password:"), \$opts->{'passwd'}, $table, 0, 0); + $entry->grab_focus(); + + if($self->{'OpenSSL'}->{'version'} !~ /^0\.9\.[0-6][a-z]?$/) { + # OpenSSL < 0.9.7 was not able to handle revocation reasons + $label = GUI::HELPERS::create_label( + _("Revocation Reason:"), 'left', 0, 0); + + $table->attach_defaults($label, 0, 1, 1, 2); + + $combo = Gtk2::Combo->new(); + @combostrings = qw( + unspecified + keyCompromise + CACompromise + affiliationChanged + superseded + cessationOfOperation + certificateHold); + $combo->set_popdown_strings(@combostrings); + $combo->set_use_arrows(1); + $combo->set_value_in_list(1, 0); + + $combo->entry->signal_connect('changed' => + sub{GUI::CALLBACK::entry_to_var( + $combo, $combo->entry, \$opts->{'reason'}, undef, undef)}); + + $table->attach_defaults($combo, 1, 2, 1, 2); } + + $box->show_all(); + + return; +} + +# +# get data for exporting a crl +# +sub show_crl_export_dialog { + my ($self, $opts) = @_; + + my ($box, $button_ok, $button_cancel, $button, $label, $format1, $format2, + $format3, $table, $entry, $fileentry, $hbox); + + $button_ok = Gtk2::Button->new_from_stock('gtk-save'); + $button_ok->signal_connect('clicked' => + sub { $self->{'CA'}->export_crl($self, $opts, $box) }); + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect('clicked', sub { $box->destroy() }); + + $box = GUI::HELPERS::dialog_box( + _("Export CRL"), _("Export Revocation List to File"), + $button_ok, $button_cancel); + + # small table for file selection + $table = Gtk2::Table->new(3, 3, 0); + $table->set_col_spacing(0, 10); + $box->vbox->add($table); + + $label = GUI::HELPERS::create_label(_("File:"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, 0, 1); + + $fileentry = Gtk2::Entry->new(); + $table->attach_defaults($fileentry, 1, 2, 0, 1); + $fileentry->set_text($opts->{'outfile'}) if(defined($opts->{'outfile'})); + $fileentry->signal_connect( 'changed' => + sub{GUI::CALLBACK::entry_to_var( + $fileentry, $fileentry, \$opts->{'outfile'})}); + $fileentry->grab_focus(); + + $button = Gtk2::Button->new(_("Browse...")); + $button->signal_connect('clicked' => + sub{GUI::HELPERS::browse_file( + _("Export CA Certificate"), $fileentry, 'save')}); + $table->attach_defaults($button, 2, 3, 0, 1); + + $entry = GUI::HELPERS::entry_to_table(_("CA Password:"), + \$opts->{'passwd'}, $table, 1, 0); + $entry->grab_focus(); + + $entry = GUI::HELPERS::entry_to_table(_("Valid for (Days):"), + \$opts->{'days'}, $table, 2, 1); + + $label = GUI::HELPERS::create_label( + _("Export Format:"), 'left', 0, 0); + $box->vbox->add($label); + + $hbox = Gtk2::HBox->new(0, 0); + $box->vbox->add($hbox); + + $format1 = Gtk2::RadioButton->new(undef, _("PEM")); + $format1->set_active(1) + if(defined($opts->{'format'}) && $opts->{'format'} eq 'PEM'); + $format1->signal_connect('toggled' => + sub{GUI::CALLBACK::toggle_to_var($format1, + \$opts->{'format'}, 'PEM', \$opts->{'outfile'}, + \$opts->{'format'}, $fileentry)}); + $hbox->add($format1); + + $format2 = Gtk2::RadioButton->new($format1, _("DER")); + $format2->set_active(1) + if(defined($opts->{'format'}) && $opts->{'format'} eq 'DER'); + $format2->signal_connect('toggled' => + sub{GUI::CALLBACK::toggle_to_var($format2, + \$opts->{'format'}, 'DER', \$opts->{'outfile'}, + \$opts->{'format'}, $fileentry)}); + $hbox->add($format2); + + $format3 = Gtk2::RadioButton->new($format1, _("TXT")); + $format3->set_active(1) + if(defined($opts->{'format'}) && $opts->{'format'} eq 'TXT'); + $format3->signal_connect('toggled' => + sub{ GUI::CALLBACK::toggle_to_var($format3, + \$opts->{'format'}, 'TXT', \$opts->{'outfile'}, + \$opts->{'format'}, $fileentry)}); + $hbox->add($format3); + + $box->show_all(); + + return; +} + +# +# get data for exporting a ca certificate chain +# +sub show_ca_chain_export_dialog { + my ($self, $opts) = @_; + + my ($box, $button_ok, $button_cancel, $button, $label, $format1, $format2, + $format3, $table, $fileentry, $hbox); + + $button_ok = Gtk2::Button->new_from_stock('gtk-save'); + $button_ok->signal_connect('clicked', + sub { $self->{'CA'}->export_ca_chain($self, $opts, $box) }); + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect('clicked', sub { $box->destroy() }); + + $box = GUI::HELPERS::dialog_box( + _("Export CA Certificate Chain"), + _("Export CA Certificate Chain to File"), + $button_ok, $button_cancel); + + # small table for file selection + $table = Gtk2::Table->new(1, 3, 0); + $box->vbox->add($table); + + $label = GUI::HELPERS::create_label(_("File:"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, 0, 1); + + $fileentry = Gtk2::Entry->new(); + $table->attach_defaults($fileentry, 1, 2, 0, 1); + $fileentry->set_text($opts->{'outfile'}) if(defined($opts->{'outfile'})); + $fileentry->signal_connect( 'changed' => + sub { GUI::CALLBACK::entry_to_var( + $fileentry, $fileentry, \$opts->{'outfile'}) }); + $fileentry->grab_focus(); + + $button = Gtk2::Button->new(_("Browse...")); + $button->signal_connect('clicked' => + sub{GUI::HELPERS::browse_file( + _("Export CA Certificate Chain"), $fileentry, 'save')}); + $table->attach_defaults($button, 2, 3, 0, 1); + + $box->show_all(); + + return; +} + +# +# get data for exporting a ca certificate +# +sub show_ca_export_dialog { + my ($self, $opts) = @_; + + my ($box, $button_ok, $button_cancel, $label, $format1, $format2, + $format3, $table, $entry, $fileentry, $hbox, $button); + + $button_ok = Gtk2::Button->new_from_stock('gtk-save'); + $button_ok->signal_connect('clicked', + sub { $self->{'CA'}->export_ca_cert($self, $opts, $box) }); + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect('clicked', sub { $box->destroy() }); + + $box = GUI::HELPERS::dialog_box( + _("Export CA Certificate"), + _("Export CA Certificate to File"), + $button_ok, $button_cancel); + + # small table for file selection + $table = Gtk2::Table->new(1, 3, 0); + $table->set_col_spacing(0, 10); + $box->vbox->add($table); + + $label = GUI::HELPERS::create_label(_("File:"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, 0, 1); + + $fileentry = Gtk2::Entry->new(); + $table->attach_defaults($fileentry, 1, 2, 0, 1); + $fileentry->set_text($opts->{'outfile'}) if(defined($opts->{'outfile'})); + $fileentry->signal_connect('changed' => + sub{GUI::CALLBACK::entry_to_var( + $fileentry, $fileentry, \$opts->{'outfile'})}); + $fileentry->grab_focus(); + + $button = Gtk2::Button->new(_("Browse...")); + $button->signal_connect('clicked' => + sub{GUI::HELPERS::browse_file( + _("Export CA Certificate"), $fileentry, 'save')}); + $table->attach_defaults($button, 2, 3, 0, 1); + + $label = GUI::HELPERS::create_label( + _("Export Format:"), 'left', 0, 0); + $box->vbox->add($label); + + $hbox = Gtk2::HBox->new(0, 0); + $box->vbox->add($hbox); + + $format1 = Gtk2::RadioButton->new(undef, _("PEM")); + $format1->set_active(1) + if(defined($opts->{'format'}) && $opts->{'format'} eq 'PEM'); + $format1->signal_connect_after('toggled' => + sub{GUI::CALLBACK::toggle_to_var($format1, + \$opts->{'format'}, 'PEM', \$opts->{'outfile'}, + \$opts->{'format'}, $fileentry)}); + $hbox->add($format1); + + $format2 = Gtk2::RadioButton->new($format1, _("DER")); + $format2->set_active(1) + if(defined($opts->{'format'}) && $opts->{'format'} eq 'DER'); + $format2->signal_connect_after('toggled' => + sub{GUI::CALLBACK::toggle_to_var($format2, + \$opts->{'format'}, 'DER', \$opts->{'outfile'}, + \$opts->{'format'}, $fileentry)}); + $hbox->add($format2); + + $format3 = Gtk2::RadioButton->new($format1, _("TXT")); + $format3->set_active(1) + if(defined($opts->{'format'}) && $opts->{'format'} eq 'TXT'); + $format3->signal_connect_after('toggled' => + sub{GUI::CALLBACK::toggle_to_var($format3, + \$opts->{'format'}, 'TXT', \$opts->{'outfile'}, + \$opts->{'format'}, $fileentry)}); + $hbox->add($format3); + + $box->show_all(); + + return; +} + +# +# get password for exporting keys +# +sub show_key_nopasswd_dialog { + my ($self, $opts) = @_; + + my ($box, $button_ok, $button_cancel, $label, $table, $entry); + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + $button_ok->signal_connect('clicked', + sub { $self->{'KEY'}->get_export_key($self, $opts, $box) }); + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect('clicked', sub { $box->destroy() }); + + $box = GUI::HELPERS::dialog_box( + _("Export Key without Passphrase"), + _("Export Key without Passphrase"), + $button_ok, $button_cancel); + + $label = GUI::HELPERS::create_label( + _("I hope you know what you\'re doing?"), 'center', 1, 0); + $box->vbox->add($label); + + $label = GUI::HELPERS::create_label( + _("The Key Passphrase is needed for decryption of the Key"), + 'center', 1, 0); + $box->vbox->add($label); + + # small table for data + $table = Gtk2::Table->new(1, 2, 0); + $table->set_col_spacing(0, 10); + $box->vbox->add($table); + + $entry = GUI::HELPERS::entry_to_table(_("Password:"), + \$opts->{'passwd'}, $table, 0, 0); + $entry->grab_focus(); + + $box->show_all(); + + return; +} + +# +# get filename for importing a request +# +sub show_req_import_dialog { + my $self = shift; + + my $opts = {}; + my($box, $button_ok, $button_cancel, $button, $entry, $table, $label); + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + $button_ok->signal_connect('clicked', + sub { $self->{'REQ'}->get_import_req($self, $opts, $box) }); + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect('clicked', sub { $box->destroy() }); + + $box = GUI::HELPERS::dialog_box( + _("Import Request"), _("Import Request from File"), + $button_ok, $button_cancel); + + # small table for data + $table = Gtk2::Table->new(2, 3, 0); + $table->set_col_spacing(0, 10); + $box->vbox->add($table); + + $label = GUI::HELPERS::create_label(_("File:"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, 0, 1); + + $entry = Gtk2::Entry->new(); + $table->attach_defaults($entry, 1, 2, 0, 1); + $entry->signal_connect( 'changed' => + sub{ GUI::CALLBACK::entry_to_var($entry, + $entry, \$opts->{'infile'})}); + $entry->grab_focus(); + + $button = Gtk2::Button->new(_("Browse...")); + $button->signal_connect('clicked' => + sub{GUI::HELPERS::browse_file( + _("Import Request from File"), $entry, 'open')}); + $table->attach_defaults($button, 2, 3, 0, 1); + + $box->show_all(); + + return; +} + + +# +# get data for exporting a certificate +# +sub show_export_dialog { + my ($self, $opts, $mode) = @_; + + my ($box, $button_ok, $button_cancel, $button, $label, $table, $entry, + $fileentry, $format1, $format2, $format3, $format4, $format5, + $format6, $passbox, $pass1, $pass2, $title, $text, $t, $incbox, + $inc1, $inc2, $fpbox, $incfp1, $incfp2); + + if($mode eq 'cert') { + $title = _("Export Certificate"); + } elsif($mode eq 'key') { + $title = _("Export Key"); + } else { + GUI::HELPERS::print_error( + _("Invalid mode for show_export_dialog(): ").$mode); + return; + } + + $button_ok = Gtk2::Button->new_from_stock('gtk-save'); + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + + if($mode eq 'cert') { + $button_ok->signal_connect('clicked', + sub { $self->{'CERT'}->get_export_cert($self, $opts, $box) }); + } else { + $button_ok->signal_connect('clicked', + sub { $self->{'KEY'}->get_export_key($self, $opts, $box) }); + } + $button_cancel->signal_connect('clicked', sub { $box->destroy() }); + + if($mode eq 'cert') { + $text = _("Export Certificate to File"); + } else { + $text = _("Export Key to File"); + } + + $box = GUI::HELPERS::dialog_box($title, $text, $button_ok, $button_cancel); + + # small table for file selection + $table = Gtk2::Table->new(1, 3, 0); + $table->set_col_spacing(0, 10); + $box->vbox->add($table); + + $label = GUI::HELPERS::create_label(_("File:"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, 0, 1); + + if($mode eq 'cert') { + $t = _("Export Certificate"); + }else { + $t = _("Export Key"); + } + + $fileentry = Gtk2::Entry->new(); + $table->attach_defaults($fileentry, 1, 2, 0, 1); + $fileentry->set_text($opts->{'outfile'}) if(defined($opts->{'outfile'})); + $fileentry->signal_connect( 'changed', + sub{ GUI::CALLBACK::entry_to_var( + $fileentry, $fileentry, \$opts->{'outfile'})}); + $fileentry->grab_focus(); + + $button = Gtk2::Button->new(_("Browse...")); + $button->signal_connect('clicked' => + sub{GUI::HELPERS::browse_file( + $t, $fileentry, 'save')}); + $table->attach_defaults($button, 2, 3, 0, 1); + + $label = GUI::HELPERS::create_label( + _("Export Format:"), 'center', 0, 0); + $box->vbox->add($label); + + if($mode eq 'cert') { + $t = _("PEM (Certificate)"); + }else { + $t = _("PEM (Key)"); + } + + $format1 = Gtk2::RadioButton->new(undef, $t); + $format1->set_active(1) + if(defined($opts->{'format'}) && $opts->{'format'} eq 'PEM'); + $box->vbox->add($format1); + + if($mode eq 'cert') { + $t = _("DER (Certificate)"); + }else { + $t = _("DER (Key without Passphrase)"); + } + + $format2 = Gtk2::RadioButton->new($format1, $t); + $format2->set_active(1) + if(defined($opts->{'format'}) && $opts->{'format'} eq 'DER'); + $box->vbox->add($format2); + + $t = _("PKCS#12 (Certificate & Key)"); + + $format3 = Gtk2::RadioButton->new($format1, $t); + $format3->set_active(1) + if(defined($opts->{'format'}) && $opts->{'format'} eq 'P12'); + $box->vbox->add($format3); + + $t = _("Zip (Certificate & Key)"); + + $format4 = Gtk2::RadioButton->new($format1, $t); + $format4->set_active(1) + if(defined($opts->{'format'}) && $opts->{'format'} eq 'ZIP'); + $box->vbox->add($format4); + if(not -x $self->{'init'}->{'zipbin'}) { + $format4->set_sensitive(0); + } + + $t = _("Tar (Certificate & Key)"); + + $format5 = Gtk2::RadioButton->new($format1, $t); + $format5->set_active(1) + if(defined($opts->{'format'}) && $opts->{'format'} eq 'TAR'); + $box->vbox->add($format5); + if(not -x $self->{'init'}->{'tarbin'}) { + $format5->set_sensitive(0); + } + + if($mode eq 'cert') { + $format6 = Gtk2::RadioButton->new( + $format1, _("TXT (Certificate)")); + $format6->set_active(1) + if(defined($opts->{'format'}) && $opts->{'format'} eq 'TXT'); + $box->vbox->add($format6); + } else { # no password for PEM key + $label = GUI::HELPERS::create_label( + _("Without Passphrase (PEM/PKCS#12)"), 'left', 0, 0); + $box->vbox->add($label); + + $passbox = Gtk2::HBox->new(0, 0); + $box->vbox->add($passbox); + + $pass1 = Gtk2::RadioButton->new(undef, _("Yes")); + $pass1->set_active(1) + if(defined($opts->{'nopass'}) && $opts->{'nopass'} == 1); + $passbox->add($pass1); + + $pass2 = Gtk2::RadioButton->new($pass1, _("No")); + $pass2->set_active(1) + if(defined($opts->{'nopass'}) && $opts->{'nopass'} == 0); + $passbox->add($pass2); + } + + # add key/certificate + + if($mode eq 'cert') { + $label = GUI::HELPERS::create_label( + _("Include Key (PEM)"), 'left', 0, 0); + $box->vbox->add($label); + + } else { + $label = GUI::HELPERS::create_label( + _("Include Certificate (PEM)"), 'left', 0, 0); + $box->vbox->add($label); + } + + $incbox = Gtk2::HBox->new(0, 0); + $box->vbox->add($incbox); + + $inc1 = Gtk2::RadioButton->new(undef, _("Yes")); + $inc1->set_active(1) + if(defined($opts->{'include'}) && $opts->{'include'} == 1); + $incbox->add($inc1); + + $inc2 = Gtk2::RadioButton->new($inc1, _("No")); + $inc2->set_active(1) + if(defined($opts->{'include'}) && $opts->{'include'} == 0); + $incbox->add($inc2); + + # add fingerprint + if($mode eq 'cert') { + $label = GUI::HELPERS::create_label( + _("Include Fingerprint (PEM)"), 'left', 0, 0); + $box->vbox->add($label); + + $fpbox = Gtk2::HBox->new(0, 0); + $box->vbox->add($fpbox); + + $incfp1 = Gtk2::RadioButton->new(undef, _("Yes")); + $incfp1->set_active(1) + if(defined($opts->{'incfp'}) && $opts->{'incfp'} == 1); + $fpbox->add($incfp1); + + $incfp2 = Gtk2::RadioButton->new($incfp1, _("No")); + $incfp2->set_active(1) + if(defined($opts->{'incfp'}) && $opts->{'incfp'} == 0); + $fpbox->add($incfp2); + } + + if($mode eq 'cert') { + $format1->signal_connect('toggled' => + sub{ GUI::CALLBACK::toggle_to_var($format1, + \$opts->{'format'}, 'PEM', \$opts->{'outfile'}, + \$opts->{'format'}, $fileentry)}); + $format2->signal_connect('toggled' => + sub{ &GUI::CALLBACK::toggle_to_var($format2, + \$opts->{'format'}, 'DER', \$opts->{'outfile'}, + \$opts->{'format'}, $fileentry)}); + $format3->signal_connect('toggled' => + sub{ GUI::CALLBACK::toggle_to_var($format3, + \$opts->{'format'}, 'P12', \$opts->{'outfile'}, + \$opts->{'format'}, $fileentry)}); + $format4->signal_connect('toggled' => + sub{ GUI::CALLBACK::toggle_to_var($format4, + \$opts->{'format'}, 'ZIP', \$opts->{'outfile'}, + \$opts->{'format'}, $fileentry)}); + $format5->signal_connect('toggled' => + sub{ GUI::CALLBACK::toggle_to_var($format5, + \$opts->{'format'}, 'TAR', \$opts->{'outfile'}, + \$opts->{'format'}, $fileentry)}); + $format6->signal_connect('toggled' => + sub{ GUI::CALLBACK::toggle_to_var($format6, + \$opts->{'format'}, 'TXT', \$opts->{'outfile'}, + \$opts->{'format'}, $fileentry)}); + $inc1->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var($incfp1, \$opts->{'include'}, 1)}); + $inc2->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var($incfp2, \$opts->{'include'}, 0)}); + $incfp1->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var($incfp1, \$opts->{'incfp'}, 1)}); + $incfp2->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var($incfp2, \$opts->{'incfp'}, 0)}); + }else { + $format1->signal_connect('toggled' => + sub{ GUI::CALLBACK::toggle_to_var($format1, + \$opts->{'format'}, 'PEM', \$opts->{'outfile'}, + \$opts->{'format'}, $fileentry, $pass1, $pass2)}); + $format2->signal_connect('toggled' => + sub{ &GUI::CALLBACK::toggle_to_var($format2, + \$opts->{'format'}, 'DER', \$opts->{'outfile'}, + \$opts->{'format'}, $fileentry, $pass1, $pass2)}); + $format3->signal_connect('toggled' => + sub{ GUI::CALLBACK::toggle_to_var($format3, + \$opts->{'format'}, 'P12', \$opts->{'outfile'}, + \$opts->{'format'}, $fileentry, $pass1, $pass2)}); + $format4->signal_connect('toggled' => + sub{ GUI::CALLBACK::toggle_to_var($format4, + \$opts->{'format'}, 'ZIP', \$opts->{'outfile'}, + \$opts->{'format'}, $fileentry, $pass1, $pass2)}); + $format5->signal_connect('toggled' => + sub{ GUI::CALLBACK::toggle_to_var($format5, + \$opts->{'format'}, 'TAR', \$opts->{'outfile'}, + \$opts->{'format'}, $fileentry, $pass1, $pass2)}); + $pass1->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var($pass1, \$opts->{'nopass'}, 1)}); + $pass2->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var($pass2, \$opts->{'nopass'}, 0)}); + $inc1->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var($inc1, \$opts->{'include'}, 1)}); + $inc2->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var($inc2, \$opts->{'include'}, 0)}); + } + + $box->show_all(); + + return; +} + +# +# get export passwd for pkcs#12 +# +sub show_p12_export_dialog { + my ($self, $opts, $mode) = @_; + + my ($box, $label, $table, $entry, $button_ok, $button_cancel, $radiobox, + $includeca1, $includeca2, $passbox, $pass1, $pass2); + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + if($mode eq 'key') { + $button_ok->signal_connect('clicked', + sub { $self->{'KEY'}->get_export_key($self, $opts, $box) }); + } elsif($mode eq 'cert') { + $button_ok->signal_connect('clicked', + sub { $self->{'CERT'}->get_export_cert($self, $opts, $box) }); + } + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect('clicked', sub { $box->destroy() }); + + $box = GUI::HELPERS::dialog_box( + _("Export to PKCS#12"), + _("Export to PKCS#12"), + $button_ok, $button_cancel); + + # small table for storage name + $table = Gtk2::Table->new(2, 2, 0); + $box->vbox->add($table); + + $entry = GUI::HELPERS::entry_to_table(_("Key Password:"), + \$opts->{'passwd'}, $table, 0, 0); + $entry->grab_focus(); + + $entry = GUI::HELPERS::entry_to_table(_("Export Password:"), + \$opts->{'p12passwd'}, $table, 1, 0); + + $entry = GUI::HELPERS::entry_to_table(_("Friendly Name:"), + \$opts->{'friendlyname'}, $table, 2, 1); + + $label = GUI::HELPERS::create_label( + _("Without Passphrase"), 'left', 0, 0); + $box->vbox->add($label); + + $passbox = Gtk2::HBox->new(0, 0); + $box->vbox->add($passbox); + + $pass1 = Gtk2::RadioButton->new(undef, _("Yes")); + $pass1->signal_connect_after('toggled' => + sub { GUI::CALLBACK::toggle_to_var( + $pass1, \$opts->{'nopass'}, 1) }); + $passbox->add($pass1); + + $pass2 = Gtk2::RadioButton->new($pass1, _("No")); + $pass2->signal_connect_after('toggled' => + sub { GUI::CALLBACK::toggle_to_var( + $pass2, \$opts->{'nopass'}, 0) }); + $passbox->add($pass2); + + if((defined($opts->{'nopass'})) && ($opts->{'nopass'} == 1)) { + $pass1->set_active(1); + } else { + $pass2->set_active(1); + } + + $label = GUI::HELPERS::create_label( + _("Add CA Certificate to PKCS#12 structure"), 'left', 0, 0); + $box->vbox->add($label); + + $radiobox = Gtk2::HBox->new(0, 0); + $box->vbox->add($radiobox); + + $includeca1 = Gtk2::RadioButton->new(undef, _("Yes")); + $includeca1->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var( + $includeca1, \$opts->{'includeca'}, 1) }); + $radiobox->add($includeca1); + + $includeca2 = Gtk2::RadioButton->new($includeca1, _("No")); + $includeca2->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var( + $includeca2, \$opts->{'includeca'}, 0) }); + $radiobox->add($includeca2); + + if(defined($opts->{'includeca'}) && $opts->{'includeca'} == 1) { + $includeca1->set_active(1); + } else { + $includeca2->set_active(1); + } + + $box->show_all(); + + return; +} + +# +# get data for signing a request +# +sub show_req_sign_dialog { + my ($self, $opts) = @_; + + my($box, $button_ok, $button_cancel, $entry, $table, $t, $rows, $key1, + $key2, $radiobox, $label); + + $rows = 0; + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + $button_ok->signal_connect('clicked', + sub { $self->{'REQ'}->get_sign_req($self, $opts, $box) }); + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect('clicked', sub { $box->destroy() }); + + $box = GUI::HELPERS::dialog_box( + _("Sign Request"), _("Sign Request/Create Certificate"), + $button_ok, $button_cancel); + + # small table for data + $table = Gtk2::Table->new(2, 2, 0); + $table->set_col_spacing(0, 10); + $box->vbox->add($table); + + $entry = GUI::HELPERS::entry_to_table(_("CA Password:"), + \$opts->{'passwd'}, $table, $rows, 0); + $rows++; + $entry->grab_focus(); + + + $entry = GUI::HELPERS::entry_to_table(_("Valid for (Days):"), + \$opts->{'days'}, $table, $rows, 1); + $rows++; + + # print STDERR "DEBUG: got type: $opts->{'type'}\n"; + + if($opts->{'type'} eq 'server') { + if(defined($self->{'TCONFIG'}->{'server_cert'}->{'subjectAltName'}) && + $self->{'TCONFIG'}->{'server_cert'}->{'subjectAltName'} eq 'user') { + if($self->{'TCONFIG'}->{'server_cert'}->{'subjectAltNameType'} + eq 'ip'){ + $t = _("Subject alternative name (IP Address):"); + }elsif($self->{TCONFIG}->{'server_cert'}->{'subjectAltNameType'} + eq 'dns'){ + $t = _("Subject alternative name (DNS Name):"); + }elsif($self->{TCONFIG}->{'server_cert'}->{'subjectAltNameType'} + eq 'raw'){ + $t = _("Subject alternative name (raw):"); + } + $entry = GUI::HELPERS::entry_to_table($t, + \$opts->{'subjectAltName'}, $table, $rows, 1); + $rows++; + } + if(defined($self->{'TCONFIG'}->{'server_cert'}->{'extendedKeyUsage'}) && + $self->{'TCONFIG'}->{'server_cert'}->{'extendedKeyUsage'} eq 'user') { + $t = _("Extended Key Usage:"); + $entry = GUI::HELPERS::entry_to_table($t, + \$opts->{'extendedKeyUsage'}, $table, $rows, 1); + $rows++; + } + if(defined($self->{'TCONFIG'}->{'server_cert'}->{'nsSslServerName'}) && + $self->{'TCONFIG'}->{'server_cert'}->{'nsSslServerName'} eq 'user') { + $t = _("Netscape SSL Server Name:"); + $entry = GUI::HELPERS::entry_to_table($t, + \$opts->{'nsSslServerName'}, $table, $rows, 1); + $rows++; + } + if(defined($self->{'TCONFIG'}->{'server_cert'}->{'nsRevocationUrl'}) && + $self->{'TCONFIG'}->{'server_cert'}->{'nsRevocationUrl'} eq 'user') { + $t = _("Netscape Revocation URL:"); + $entry = GUI::HELPERS::entry_to_table($t, + \$opts->{'nsRevocationUrl'}, $table, $rows, 1); + $rows++; + } + if(defined($self->{'TCONFIG'}->{'server_cert'}->{'nsRenewalUrl'}) && + $self->{'TCONFIG'}->{'server_cert'}->{'nsRenewalUrl'} eq 'user') { + $t = _("Netscape Renewal URL:"); + $entry = GUI::HELPERS::entry_to_table($t, + \$opts->{'nsRenewalUrl'}, $table, $rows, 1); + $rows++; + } + }elsif($opts->{'type'} eq 'client') { + if(defined($self->{'TCONFIG'}->{'client_cert'}->{'subjectAltName'}) && + $self->{'TCONFIG'}->{'client_cert'}->{'subjectAltName'} eq 'user') { + if($self->{'TCONFIG'}->{'client_cert'}->{'subjectAltNameType'} + eq 'ip'){ + $t = _("Subject alternative name (IP Address):"); + }elsif($self->{TCONFIG}->{'client_cert'}->{'subjectAltNameType'} + eq 'dns'){ + $t = _("Subject alternative name (DNS Name):"); + }elsif($self->{TCONFIG}->{'client_cert'}->{'subjectAltNameType'} + eq 'mail'){ + $t = _("Subject alternative name (eMail Address):"); + }elsif($self->{TCONFIG}->{'client_cert'}->{'subjectAltNameType'} + eq 'raw'){ + $t = _("Subject alternative name (raw):"); + } + $entry = GUI::HELPERS::entry_to_table($t, + \$opts->{'subjectAltName'}, $table, $rows, 1); + $rows++; + } + if(defined($self->{'TCONFIG'}->{'client_cert'}->{'extendedKeyUsage'}) && + $self->{'TCONFIG'}->{'client_cert'}->{'extendedKeyUsage'} eq 'user') { + $t = _("Extended Key Usage:"); + $entry = GUI::HELPERS::entry_to_table($t, + \$opts->{'extendedKeyUsage'}, $table, $rows, 1); + $rows++; + } + if(defined($self->{'TCONFIG'}->{'client_cert'}->{'nsRevocationUrl'}) && + $self->{'TCONFIG'}->{'client_cert'}->{'nsRevocationUrl'} eq 'user') { + $t = _("Netscape Revocation URL:"); + $entry = GUI::HELPERS::entry_to_table($t, + \$opts->{'nsRevocationUrl'}, $table, $rows, 1); + $rows++; + } + if(defined($self->{'TCONFIG'}->{'client_cert'}->{'nsRenewalUrl'}) && + $self->{'TCONFIG'}->{'client_cert'}->{'nsRenewalUrl'} eq 'user') { + $t = _("Netscape Renewal URL:"); + $entry = GUI::HELPERS::entry_to_table($t, + \$opts->{'nsRenewalUrl'}, $table, $rows, 1); + $rows++; + } + } + + # OpenSSL < 0.9.7 was not able to dynamically handle mailadresses in DNs + if($self->{'OpenSSL'}->{'version'} !~ /^0\.9\.[0-6][a-z]?$/) { + $radiobox = Gtk2::HBox->new(0, 0); + $key1 = Gtk2::RadioButton->new(undef, _("Yes")); + $key1->set_active(1); + $key1->signal_connect('toggled' => + sub{GUI::CALLBACK::toggle_to_var($key1, \$opts->{'noemaildn'}, 0)}); + $radiobox->add($key1); + + $key2 = Gtk2::RadioButton->new($key1, _("No")); + $key2->signal_connect('toggled' => + sub{GUI::CALLBACK::toggle_to_var($key2, \$opts->{'noemaildn'}, 1)}); + $radiobox->add($key2); + + $label = GUI::HELPERS::create_label( + _("Add eMail Address to Subject DN:"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows, $rows+1); + $table->attach_defaults($radiobox, 1, 2, $rows, $rows+1); + } + + $box->show_all(); + + return; +} + +# +# get data for creating a new CA +# +sub show_ca_dialog { + my ($self, $opts, $mode) = @_; + + my ($box, $button_ok, $button_cancel, $label, $table, $entry, + $catable, $pwtable, $radiobox, $key1, $key2, $key3, + $key4, $key5); + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + $button_ok->can_default(1); + $button_ok->signal_connect('clicked', + sub { $self->{'CA'}->get_ca_create($self, $opts, $box, $mode) }); + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect('clicked', sub { $box->destroy() }); + + if(defined($mode) && $mode eq "sub") { + $box = GUI::HELPERS::dialog_box( + _("Create CA"), _("Create a new Sub CA"), + $button_ok, $button_cancel); + } else { + $box = GUI::HELPERS::dialog_box( + _("Create CA"), _("Create a new CA"), + $button_ok, $button_cancel); + } + + $button_ok->grab_default(); + + if(defined($mode) && $mode eq "sub") { + # small table for ca-password + $pwtable = Gtk2::Table->new(1, 2, 0); + $pwtable->set_col_spacing(0, 10); + $box->vbox->add($pwtable); + + $entry = GUI::HELPERS::entry_to_table( + _("CA Password (for creating the new CA):"), + \$opts->{'parentpw'}, $pwtable, 0, 0); + $entry->grab_focus(); + } + + # small table for storage name + $table = Gtk2::Table->new(1, 2, 0); + $table->set_col_spacing(0, 10); + $box->vbox->add($table); + + $entry = GUI::HELPERS::entry_to_table( + _("Name (for local storage):"), + \$opts->{'name'}, $table, 0, 1); + if(not defined($mode)) { + $entry->grab_focus(); + } + + $label = GUI::HELPERS::create_label( + _("Data for CA Certificate"), 'left', 0, 0); + $box->vbox->add($label); + + # table for ca data + $catable = Gtk2::Table->new(1, 13, 0); + $catable->set_col_spacing(0, 10); + $box->vbox->add($catable); + + $entry = GUI::HELPERS::entry_to_table( + _("Common Name (for the CA):"), + \$opts->{'CN'}, $catable, 0, 1); + + $entry = GUI::HELPERS::entry_to_table( + _("Country Name (2 letter code):"), + \$opts->{'C'}, $catable, 1, 1); + + $entry = GUI::HELPERS::entry_to_table( + _("Password (needed for signing):"), + \$opts->{'passwd'}, $catable, 2, 0); + + $entry = GUI::HELPERS::entry_to_table( + _("Password (confirmation):"), + \$opts->{'passwd2'}, $catable, 3, 0); + + $entry = GUI::HELPERS::entry_to_table( + _("State or Province Name:"), + \$opts->{'ST'}, $catable, 4, 1); + + $entry = GUI::HELPERS::entry_to_table( + _("Locality Name (eg. city):"), + \$opts->{'L'}, $catable, 5, 1); + + $entry = GUI::HELPERS::entry_to_table( + _("Organization Name (eg. company):"), + \$opts->{'O'}, $catable, 6, 1); + + $entry = GUI::HELPERS::entry_to_table( + _("Organizational Unit Name (eg. section):"), + \$opts->{'OU'}->[0], $catable, 7, 1); + + $entry = GUI::HELPERS::entry_to_table( + _("eMail Address").":", + \$opts->{'EMAIL'}, $catable, 8, 1); + + $entry = GUI::HELPERS::entry_to_table( + _("Valid for (Days):"), + \$opts->{'days'}, $catable, 9, 1); + + $label = GUI::HELPERS::create_label( + _("Keylength").":", 'left', 0, 0); + $catable->attach_defaults($label, 0, 1, 10, 11); + + $radiobox = Gtk2::HBox->new(0, 0); + $key1 = Gtk2::RadioButton->new(undef, '1024'); + $key1->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var($key1, \$opts->{'bits'}, 1024)}); + $radiobox->add($key1); + + $key2 = Gtk2::RadioButton->new($key1, '2048'); + $key2->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var($key2, \$opts->{'bits'}, 2048)}); + $radiobox->add($key2); + + $key3 = Gtk2::RadioButton->new($key1, '4096'); + $key3->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var($key3, \$opts->{'bits'}, 4096)}); + $radiobox->add($key3); + + # set default + if(defined($opts->{'bits'}) && $opts->{'bits'} == 1024) { + $key1->set_active(1); + } elsif (defined($opts->{'bits'}) && $opts->{'bits'} == 2048) { + $key2->set_active(1); + } elsif (defined($opts->{'bits'}) && $opts->{'bits'} == 4096) { + $key3->set_active(1); + } + + $catable->attach_defaults($radiobox, 1, 2, 10, 11); + + $label = GUI::HELPERS::create_label(_("Digest").":", 'left', 0, 0); + $catable->attach_defaults($label, 0, 1, 15, 16); + + $radiobox = Gtk2::HBox->new(0, 0); + &_fill_radiobox($radiobox, \$opts->{'digest'}, %md_algorithms); + $catable->attach_defaults($radiobox, 1, 2, 15, 16); + + $box->show_all(); + + return; +} + +# +# get data for importing a new CA +# +sub show_ca_import_dialog { + my ($self, $opts) = @_; + + my ($box, $button, $button_ok, $button_cancel, $label, $table, $filetable, + $pwtable, $entry, $certentry, $keyentry, $direntry, $indexentry); + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + $button_ok->can_default(1); + $button_ok->signal_connect('clicked', + sub { $self->{'CA'}->get_ca_import($self, $opts, $box) }); + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect('clicked', sub { $box->destroy() }); + + $box = GUI::HELPERS::dialog_box( + _("Import CA"), _("Import an existing CA into TinyCA"), + $button_ok, $button_cancel); + + $button_ok->grab_default(); + + # small table for old ca-password + $pwtable = Gtk2::Table->new(1, 2, 0); + $pwtable->set_col_spacing(0, 10); + $box->vbox->add($pwtable); + + $entry = GUI::HELPERS::entry_to_table( + _("Password of the private CA key (Needed for import):"), + \$opts->{'passwd'}, $pwtable, 0, 0); + $entry->grab_focus(); + + # small table for storage name and new passwords + $table = Gtk2::Table->new(1, 2, 0); + $table->set_col_spacing(0, 10); + $box->vbox->add($table); + + $entry = GUI::HELPERS::entry_to_table( + _("Name (for local storage):"), + \$opts->{'name'}, $table, 0, 1); + + $entry = GUI::HELPERS::entry_to_table( + _("New password for the CA:"), + \$opts->{'newpasswd'}, $table, 1, 0); + + $entry = GUI::HELPERS::entry_to_table( + _("Confirm password:"), + \$opts->{'newpasswd2'}, $table, 2, 0); + + # table for file selection dialogs + $label = GUI::HELPERS::create_label( + _("Files/Directories to import"), 'center', 0, 1); + $box->vbox->add($label); + + $filetable = Gtk2::Table->new(1, 3, 0); + $box->vbox->add($filetable); + + # CA certificate + $label = GUI::HELPERS::create_label( + _("CA Certificate (PEM/DER):"), 'left', 0, 0); + $filetable->attach_defaults($label, 0, 1, 0, 1); + + $certentry = Gtk2::Entry->new(); + $filetable->attach_defaults($certentry, 1, 2, 0, 1); + $certentry->set_text($opts->{'cacertfile'}) + if(defined($opts->{'cacertfile'})); + $certentry->signal_connect( 'changed' => + sub { GUI::CALLBACK::entry_to_var( + $certentry, $certentry, \$opts->{'cacertfile'}) }); + + $button = Gtk2::Button->new(_("Browse...")); + $button->signal_connect('clicked' => + sub{ GUI::HELPERS::browse_file( + _("Import CA Certificate"), $certentry, 'open') }); + $filetable->attach_defaults($button, 2, 3, 0, 1); + + # CA private key + $label = GUI::HELPERS::create_label( + _("CA private key (PEM/DER):"), 'left', 0, 0); + $filetable->attach_defaults($label, 0, 1, 1, 2); + + $keyentry = Gtk2::Entry->new(); + $filetable->attach_defaults($keyentry, 1, 2, 1, 2); + $keyentry->set_text($opts->{'cakeyfile'}) + if(defined($opts->{'cakeyfile'})); + $keyentry->signal_connect( 'changed' => + sub { GUI::CALLBACK::entry_to_var( + $keyentry, $keyentry, \$opts->{'cakeyfile'}) }); + + $button = Gtk2::Button->new(_("Browse...")); + $button->signal_connect('clicked' => + sub{ GUI::HELPERS::browse_file( + _("Import CA private Key"), $keyentry, 'open') }); + $filetable->attach_defaults($button, 2, 3, 1, 2); + + # Index file + $label = GUI::HELPERS::create_label( + _("OpenSSL Index File (index.txt):"), 'left', 0, 0); + $filetable->attach_defaults($label, 0, 1, 2, 3); + + $indexentry = Gtk2::Entry->new(); + $filetable->attach_defaults($indexentry, 1, 2, 2, 3); + $indexentry->set_text($opts->{'indexfile'}) + if(defined($opts->{'indexfile'})); + $indexentry->signal_connect( 'changed' => + sub { GUI::CALLBACK::entry_to_var( + $indexentry, $indexentry, \$opts->{'indexfile'}) }); + + $button = Gtk2::Button->new(_("Browse...")); + $button->signal_connect('clicked' => + sub{ GUI::HELPERS::browse_file( + _("Import Index File"), $indexentry, 'open') }); + $filetable->attach_defaults($button, 2, 3, 2, 3); + + # certificate directory + $label = GUI::HELPERS::create_label( + _("Directory containing certificates (PEM/DER):"), 'left', 0, 0); + $filetable->attach_defaults($label, 0, 1, 3, 4); + + $direntry = Gtk2::Entry->new(); + $filetable->attach_defaults($direntry, 1, 2, 3, 4); + $direntry->set_text($opts->{'certdir'}) + if(defined($opts->{'certdir'})); + $direntry->signal_connect( 'changed' => + sub { GUI::CALLBACK::entry_to_var( + $direntry, $direntry, \$opts->{'certdir'}) }); + + $button = Gtk2::Button->new(_("Browse...")); + $button->signal_connect('clicked' => + sub{ GUI::HELPERS::browse_file( + _("Import Certificates from directory"), $direntry, 'open') }); + $filetable->attach_defaults($button, 2, 3, 3, 4); + + $box->show_all(); + + return; +} + +# +# subroutines for pop-up boxes +# +sub show_help { + my $self = shift; + + GUI::HELPERS::print_info(_("You are kidding, are you??")); + + return; +} + +# +# About dialog +# +sub about { + my $self = shift; + my $main = shift; + + my ($aboutdialog, $href, $label); + + $aboutdialog = Gtk2::AboutDialog->new(); + $aboutdialog->set_name("TinyCA2"); + $aboutdialog->set_version($main->{'version'}); + $aboutdialog->set_copyright("2002-2006 Stephan Martin"); + $aboutdialog->set_license("GNU Public License (GPL)"); + $aboutdialog->set_website("http://tinyca.sm-zone.net/"); + $aboutdialog->set_authors("Stephan Martin "); + $aboutdialog->set_translator_credits( + _("Czech: Robert Wolf ")."\n". + _("Swedish: Daniel Nylander ")."\n". + _("Spanish: Ramon Pons Vivanco ")."\n". + _("French: Thibault Le Meur ")); + + $aboutdialog->show_all(); + + return; +} + +# +# get confirmation for deleting a request +# +sub show_del_confirm { + my ($self, $file, $type) = @_; + + my($t, $button_ok, $button_cancel, $box); + + if($type eq 'req') { + $t = _("Do you really want to delete the selected Request?"); + }elsif($type eq 'key') { + $t = _("Do you really want to delete the selected Key?"); + }elsif($type eq 'cert') { + $t = _("Do you really want to delete the selected Certificate?"); + }else{ + GUI::HELPERS::print_error("Invalid type in show_del_confirm(): ".$type); + } + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + if($type eq 'req') { + $button_ok->signal_connect('clicked', sub { + $self->{'REQ'}->del_req($self, $file); + $box->destroy() }); + }elsif($type eq 'key') { + $button_ok->signal_connect('clicked', sub { + $self->{'KEY'}->del_key($self, $file); + $box->destroy() }); + }elsif($type eq 'cert') { + $button_ok->signal_connect('clicked', sub { + $self->{'CERT'}->del_cert($self, $file); + $box->destroy() }); + } + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect('clicked', sub { $box->destroy(); return }); + + $box = Gtk2::MessageDialog->new( + undef, [qw/destroy-with-parent modal/], 'question', 'none', $t); + + $box->add_action_widget($button_ok, 0); + $box->add_action_widget($button_cancel, 1); + + $box->show_all(); +} + +# +# show warning - overwrite key +# +sub show_req_overwrite_warning { + my ($self, $opts) = @_; + + my ($box, $actionarea, $button_ok, $button_cancel, $label); + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + $button_ok->signal_connect('clicked' => + sub { $self->{'REQ'}->create_req($self, $opts); + $box->destroy() }); + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->can_default(1); + $button_cancel->signal_connect('clicked', sub { $box->destroy() }); + + $box = GUI::HELPERS::dialog_box( + _("Overwrite Request/Key"), _("Overwrite Request/Key"), + $button_ok, $button_cancel); + + $button_cancel->grab_default(); + + $label = GUI::HELPERS::create_label( + _("The Key or the Request is already existing!"), + 'center', 1, 0); + $box->vbox->add($label); + + $label = GUI::HELPERS::create_label( + _("You won't be able to sign this Request"), + 'center', 1, 0); + $box->vbox->add($label); + + $label = GUI::HELPERS::create_label( + _("if the corresponding certificate is still valid"), + 'center', 1, 0); + $box->vbox->add($label); + + $box->show_all(); + + return; +} + +# +# show warning - certificate expiration date +# +sub show_req_date_warning { + my ($self, $opts) = @_; + + my ($box, $button_ok, $button_cancel, $t); + + $t = _("The Certificate will be longer valid than your CA!"); + $t .= "\n"; + $t .= _("This may cause problems with some software!!"); + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + $button_ok->signal_connect('clicked', + sub { $opts->{'ignoredate'} = 'true'; + $self->{'REQ'}->get_sign_req($self, $opts, $box); }); + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect('clicked', sub { + $self->show_req_sign_dialog($opts); + $box->destroy(); + }); + $button_cancel->can_default(1); + + $box = GUI::HELPERS::dialog_box( + _("Expirationdate Warning"), $t, + $button_ok, $button_cancel); + + $button_cancel->grab_default(); + + $box->show_all(); +} + +# +# show CA history +# +sub show_history { + my $self = shift; + + my ($box, $button_ok, @index, $list, $list_scrolled, $store, @titles, + $column, $t, $iter, $dn, $state, $expdate, $revdate, $renderer); + + @index = + $self->{'OpenSSL'}->read_index($self->{'CA'}->{'cadir'}."/index.txt"); + + $list_scrolled = Gtk2::ScrolledWindow->new(undef, undef); + $list_scrolled->set_policy('automatic', 'automatic'); + $list_scrolled->set_shadow_type('etched-in'); + $store = Gtk2::ListStore->new( + 'Glib::String', # common name + 'Glib::String', # status + 'Glib::String', # serial + 'Glib::String', # expiration + 'Glib::String', # revocation + 'Glib::String' # reason + ); + + $list = Gtk2::TreeView->new_with_model($store); + $list->get_selection->set_mode('none'); + @titles = ( + _("Serial"), + _("Common Name"), + _("Status"), + _("Expiration Date"), + _("Revocation Date"), + _("Revocation Reason") + ); + + for (my $i = 0; $titles[$i]; $i++) { + $renderer = Gtk2::CellRendererText->new(); + $column = Gtk2::TreeViewColumn->new_with_attributes( + $titles[$i], $renderer, 'text' => $i); + $column->set_sort_column_id($i); + $column->set_resizable(1); + if ($i == 2) { + $column->set_cell_data_func ($renderer, sub { + my ($column, $cell, $model, $iter) = @_; + my $text = $model->get($iter, 2); + my $color = $text eq _("VALID")?'green':'red'; + $cell->set (text => $text, foreground => $color); + }); + } + $list->append_column($column); + } + + foreach my $tmp (@index) { + $iter = $store->append(); + $dn = HELPERS::parse_dn($tmp->{'DN'}); + if($tmp->{'STATUS'} eq 'V') { + $state = _("VALID"); + } elsif($tmp->{'STATUS'} eq 'E') { + $state = _("EXPIRED"); + } elsif($tmp->{'STATUS'} eq 'R') { + $state = _("REVOKED"); + } + + $expdate = strftime("%F", localtime($tmp->{'EXPDATE'})); + if(defined($tmp->{'REVDATE'})) { + $revdate = strftime("%F", localtime($tmp->{'REVDATE'})); + } + + $store->set($iter, + 0 => $tmp->{'SERIAL'}, + 1 => $dn->{'CN'}, + 2 => $state, + 3 => $expdate, + 4 => $revdate, + 5 => $tmp->{'REVREASON'} + ); + } + + $list_scrolled->add_with_viewport($list); + + $t = _("CA History"); + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + $button_ok->can_default(1); + $button_ok->signal_connect('clicked', sub { $box->destroy() }); + + $box = GUI::HELPERS::dialog_box($t, $t, $button_ok); + $box->set_default_size(700, 400); + + $button_ok->grab_default(); + + $box->vbox->add($list_scrolled); + + $box->show_all(); +} + +# +# get confirmation for overwriting certificate +# +sub show_cert_overwrite_confirm { + my ($self, $opts) = @_; + + my($box, $button_ok, $button_cancel, $label); + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + $button_ok->signal_connect('clicked', + sub { $opts->{'overwrite'} = 'true'; + $self->{'REQ'}->get_sign_req($self, $opts, $box) }); + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->can_default(1); + $button_cancel->signal_connect('clicked', sub { $box->destroy() }); + + $box = GUI::HELPERS::dialog_box( + _("Overwrite Certificate"), _("Overwrite Certificate"), + $button_ok, $button_cancel); + + $button_cancel->grab_default(); + + $label = GUI::HELPERS::create_label( + _("There seems to be a certificate with the same Subject already."), + 'center', 1, 0); + $box->vbox->add($label); + + $label = GUI::HELPERS::create_label( + _("Creating a new one (overwrite) will fail if it\'s not revoked or expired!"), + 'center', 1, 0); + $box->vbox->add($label); + + + $label = GUI::HELPERS::create_label( + _("Really try to overwrite the Certificate?"), 'center', 1, 0); + $box->vbox->add($label); + + $box->show_all(); + return; +} + +# +# ask if the CA shall be converted +# +sub show_ca_convert_dialog { + my ($self, $opts) = @_; + + my($box, $label, $button_ok, $button_cancel, $t); + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + $button_ok->signal_connect('clicked', + sub { + $opts->{'doconv'} = 1; + $self->{'CA'}->open_ca($self, $opts, $box) + } + ); + $button_ok->can_default(1); + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect('clicked', + sub { + $opts->{'noconv'} = 1; + $self->{'CA'}->open_ca($self, $opts, $box) + } + ); + + $box = GUI::HELPERS::dialog_box( + _("Convert CA"), _("Convert CA"), + $button_ok, $button_cancel); + + $button_ok->grab_default(); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $box->vbox->pack_start($label, 0, 0, 0); + + $t = _("This CA seems to be created with openssl 0.9.6x. And it seems like you have switched to openssl 0.9.7x."); + + $label = GUI::HELPERS::create_label($t, 'center', 1, 0); + $box->vbox->add($label); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $box->vbox->pack_start($label, 0, 0, 0); + + $t = _("You won't be able to revoke the existing certificates without converting the index file of this CA to the new format."); + + $label = GUI::HELPERS::create_label($t, 'center', 1, 0); + $box->vbox->add($label); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $box->vbox->pack_start($label, 0, 0, 0); + + $t = _("Attention: it will not be easy to switch back, this has to be done manually"); + $label = GUI::HELPERS::create_label($t, 'center', 1, 0); + $box->vbox->add($label); + + $box->show_all(); + + return; +} + +# +# create popup menu for keys +# +sub _create_key_menu { + my $self = shift; + + my ($item, $image); + + $self->{'keymenu'} = Gtk2::Menu->new(); + + $item = Gtk2::ImageMenuItem->new( _("Export Key")); + $item->signal_connect(activate => + sub { $self->{'KEY'}->get_export_key($self) }); + $image = Gtk2::Image->new_from_stock('gtk-save', 'menu'); + $item->set_image($image); + $self->{'keymenu'}->insert($item, -1); + + $item = Gtk2::ImageMenuItem->new( _("Delete Key")); + $item->signal_connect(activate => + sub { $self->{'KEY'}->get_del_key($self) }); + $image = Gtk2::Image->new_from_stock('gtk-delete', 'menu'); + $item->set_image($image); + $self->{'keymenu'}->insert($item, -1); + + $self->{'keymenu'}->show_all(); + + return; +} + +# +# create popup menus for certificates +# +sub _create_cert_menu { + my $self = shift; + + my ($item, $image); + + $self->{'certmenu'} = Gtk2::Menu->new(); + + $item = Gtk2::ImageMenuItem->new( _("Certificate Details")); + $item->signal_connect(activate => + sub { $self->show_details('cert') }); + $image = Gtk2::Image->new_from_stock('gtk-new', 'menu'); + $item->set_image($image); + $self->{'certmenu'}->insert($item, -1); + + $item = Gtk2::ImageMenuItem->new( _("View Certificate")); + $item->signal_connect(activate => + sub { $self->show_text('cert') }); + $image = Gtk2::Image->new_from_stock('gtk-find', 'menu'); + $item->set_image($image); + $self->{'certmenu'}->insert($item, -1); + + $item = Gtk2::ImageMenuItem->new( _("Export Certificate")); + $item->signal_connect(activate => + sub { $self->{'CERT'}->get_export_cert($self) }); + $image = Gtk2::Image->new_from_stock('gtk-save', 'menu'); + $item->set_image($image); + $self->{'certmenu'}->insert($item, -1); + + $item = Gtk2::ImageMenuItem->new( _("Revoke Certificate")); + $item->signal_connect(activate => + sub { $self->{'CERT'}->get_revoke_cert($self) }); + $image = Gtk2::Image->new_from_stock('gtk-stop', 'menu'); + $item->set_image($image); + $self->{'certmenu'}->insert($item, -1); + + $item = Gtk2::ImageMenuItem->new( _("Renew Certificate")); + $item->signal_connect(activate => + sub { $self->{'renewcertmenu'}->popup( + undef, undef, undef, undef, 1, 0) }); + $image = Gtk2::Image->new_from_stock('gtk-refresh', 'menu'); + $item->set_image($image); + $self->{'certmenu'}->insert($item, -1); + + $item = Gtk2::ImageMenuItem->new( _("Delete Certificate")); + $item->signal_connect(activate => + sub { $self->{'CERT'}->get_del_cert($self) }); + $image = Gtk2::Image->new_from_stock('gtk-delete', 'menu'); + $item->set_image($image); + $self->{'certmenu'}->insert($item, -1); + + $self->{'certmenu'}->show_all(); + + return; +} + +# +# create popup menus for creating certificates +# +sub _create_create_cert_menu { + my $self = shift; + + my ($item); + + $self->{'newcertmenu'} = Gtk2::Menu->new(); + + $item = Gtk2::MenuItem->new( + _("Create Key and Certificate (Server)")); + $item->signal_connect(activate => + sub { $self->{'REQ'}->get_req_create($self, "signserver") }); + $self->{'newcertmenu'}->insert($item, 0); + + $item = Gtk2::MenuItem->new( + _("Create Key and Certificate (Client)")); + $item->signal_connect(activate => + sub { $self->{'REQ'}->get_req_create($self, "signclient") }); + $self->{'newcertmenu'}->insert($item, 1); + + $self->{'newcertmenu'}->show_all(); + + return; +} + +# +# create popup menus for sign request button +# +sub _create_renew_cert_menu { + my $self = shift; + + my ($item, $opts); + + $self->{'renewcertmenu'} = Gtk2::Menu->new(); + + $item = Gtk2::MenuItem->new( + _("Renew Certificate (Server)")); + $item->signal_connect(activate => + sub { $opts->{'type'} = 'server'; + $self->{'CERT'}->get_renew_cert($self, $opts) }); + $self->{'renewcertmenu'}->insert($item, 0); + + $item = Gtk2::MenuItem->new( + _("Renew Certificate (Client)")); + $item->signal_connect(activate => + sub { $opts->{'type'} = 'client'; + $self->{'CERT'}->get_renew_cert($self, $opts) }); + $self->{'renewcertmenu'}->insert($item, 1); + + $self->{'renewcertmenu'}->show_all(); + + return; +} + +# +# create popup menus for sign request button +# +sub _create_sign_req_menu { + my $self = shift; + + my ($item, $opts); + + $self->{'reqsignmenu'} = Gtk2::Menu->new(); + + $item = Gtk2::MenuItem->new( + _("Sign Request (Server)")); + $item->signal_connect(activate => + sub { $opts->{'type'} = 'server'; + $self->{'REQ'}->get_sign_req($self, $opts) }); + $self->{'reqsignmenu'}->insert($item, 0); + + $item = Gtk2::MenuItem->new( + _("Sign Request (Client)")); + $item->signal_connect(activate => + sub { $opts->{'type'} = 'client'; + $self->{'REQ'}->get_sign_req($self, $opts) }); + $self->{'reqsignmenu'}->insert($item, 1); + + $self->{'reqsignmenu'}->show_all(); + + return; +} + +# +# create popup menus for requests +# +sub _create_req_menu { + my $self = shift; + + my ($item, $opts, $image); + + $self->{'reqmenu'} = Gtk2::Menu->new(); + + $item = Gtk2::ImageMenuItem->new( _("Request Details")); + $item->signal_connect(activate => + sub { $self->show_details('req') }); + $image = Gtk2::Image->new_from_stock('gtk-find', 'menu'); + $item->set_image($image); + $self->{'reqmenu'}->insert($item, -1); + + $item = Gtk2::ImageMenuItem->new( _("View Request")); + $item->signal_connect(activate => + sub { $self->show_text('req') }); + $image = Gtk2::Image->new_from_stock('gtk-find', 'menu'); + $item->set_image($image); + $self->{'reqmenu'}->insert($item, -1); + + $item = Gtk2::ImageMenuItem->new( _("New Request")); + $item->signal_connect(activate => + sub { $self->{'REQ'}->get_req_create($self) }); + $image = Gtk2::Image->new_from_stock('gtk-new', 'menu'); + $item->set_image($image); + $self->{'reqmenu'}->insert($item, -1); + + $item = Gtk2::ImageMenuItem->new( _("Import Request")); + $item->signal_connect(activate => + sub { $self->{'REQ'}->get_import_req($self) }); + $image = Gtk2::Image->new_from_stock('gtk-revert-to-saved', 'menu'); + $item->set_image($image); + $self->{'reqmenu'}->insert($item, -1); + + $item = Gtk2::ImageMenuItem->new( _("Sign Request")); + $item->signal_connect(activate => + sub { $self->{'reqsignmenu'}->popup( + undef, undef, undef, undef, 1, 0) }); + $image = Gtk2::Image->new_from_stock('gtk-properties', 'menu'); + $item->set_image($image); + $self->{'reqmenu'}->insert($item, -1); + + $item = Gtk2::ImageMenuItem->new( _("Delete Request")); + $item->signal_connect(activate => + sub { $self->{'REQ'}->get_del_req($self) }); + $image = Gtk2::Image->new_from_stock('gtk-delete', 'menu'); + $item->set_image($image); + $self->{'reqmenu'}->insert($item, -1); + + $self->{'reqmenu'}->show_all(); + + return; +} + +sub _fill_radiobox { + my($radiobox, $var, %values) = @_; + my($previous_key, $value); + + $previous_key = undef; + for $value (keys %values) { + my $display_name = $values{$value}; + my $key = Gtk2::RadioButton->new($previous_key, $display_name); + $key->set_active(1) if(defined($$var) && $$var eq $value); + $key->signal_connect('toggled' => + sub{GUI::CALLBACK::toggle_to_var($key, $var, $value)}); + $radiobox->add($key); + $previous_key = $key; + } +} + +1 diff --git a/lib/GUI/CALLBACK.pm b/lib/GUI/CALLBACK.pm new file mode 100644 index 0000000..ebed074 --- /dev/null +++ b/lib/GUI/CALLBACK.pm @@ -0,0 +1,173 @@ +# Copyright (c) Stephan Martin +# +# $Id: CALLBACK.pm,v 1.6 2006/06/28 21:50:42 sm Exp $ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + +use strict; +package GUI::CALLBACK; + +use POSIX; + +# +# fill given var-reference with text from entry +# +sub entry_to_var { + my ($widget, $entry, $var, $box, $words) = @_; + + if(defined($words)) { + $$var = $words->{$entry->get_text()}; + }else{ + $$var = $entry->get_text(); + } + + if(defined($box)) { + $box->{'button_ok'}->set_sensitive(1); + $box->{'button_apply'}->set_sensitive(1); + } + + return; +} + +# +# fill given var-reference with text from entry subjectAltName +# and set senitivity of togglebuttons +# +sub entry_to_var_san { + my ($widget, $entry, $var, $box, $words, $radio1, $radio2, $radio3, $radio4) = @_; + + if(defined($words)) { + if(my $tmp = $words->{$entry->get_text()}) { + $$var = $tmp; + } else { + $$var = $entry->get_text(); + } + #print STDERR "DEBUG: var: $$var\n"; + if($$var eq 'user') { + #print STDERR "set sensitive(1)\n"; + $radio1->set_sensitive(1) if(defined($radio1)); + $radio2->set_sensitive(1) if(defined($radio2)); + $radio3->set_sensitive(1) if(defined($radio3)); + $radio4->set_sensitive(1) if(defined($radio4)); + }else{ + #print STDERR "DEBUG: set sensitive(0)\n"; + #print STDERR "DEBUG: r1 $radio1 r2 $radio2 r3 $radio3 r4 $radio4\n"; + $radio1->set_sensitive(0) if(defined($radio1)); + $radio2->set_sensitive(0) if(defined($radio2)); + $radio3->set_sensitive(0) if(defined($radio3)); + $radio4->set_sensitive(0) if(defined($radio4)); + } + }else{ + $$var = $entry->get_text(); + } + + if(defined($box)) { + $box->{'button_ok'}->set_sensitive(1); + $box->{'button_apply'}->set_sensitive(1); + } + + return; +} + +# +# fill given var-reference with text from entry subjectAltName +# and set senitivity of togglebuttons +# +sub entry_to_var_key { + my ($widget, $entry, $var, $box, $words, $radio1, $radio2, $radio3) = @_; + + if(defined($words)) { + if(my $tmp = $words->{$entry->get_text()}) { + $$var = $tmp; + } else { + $$var = $entry->get_text(); + } + if(($$var ne '') && ($$var ne 'none')) { + $radio1->set_sensitive(1) if(defined($radio1)); + $radio2->set_sensitive(1) if(defined($radio2)); + $radio3->set_sensitive(1) if(defined($radio3)); + }else{ + $radio1->set_sensitive(0) if(defined($radio1)); + $radio2->set_sensitive(0) if(defined($radio2)); + $radio3->set_sensitive(0) if(defined($radio3)); + } + }else{ + $$var = $entry->get_text(); + } + + if(defined($box)) { + $box->{'button_ok'}->set_sensitive(1); + $box->{'button_apply'}->set_sensitive(1); + } + + return; +} + +# +# fill given var-reference with value from togglebutton +# +sub toggle_to_var { + my ($button, $var, $value, $outfileref, $formatref, $fileentry, $pass1, + $pass2) = @_; + + $$var = $value; + + if(defined($outfileref) && defined($formatref)) { + if($$outfileref =~ s/\.(pem|der|txt|p12|zip|tar)$//i) { + $$outfileref .= "." . lc $$formatref; + # something seem broken, need tmp var + my $tmp = $$outfileref; + $fileentry->set_text($tmp); + } + } + if(defined($pass1) && defined($pass2)) { + if($$formatref eq "PEM") { + $pass1->set_sensitive(1); + $pass2->set_sensitive(1); + } elsif ($$formatref eq "DER") { + $pass1->set_sensitive(0); + $pass2->set_sensitive(0); + } elsif ($$formatref eq "P12") { + $pass1->set_sensitive(0); + $pass2->set_sensitive(0); + } elsif ($$formatref eq "ZIP") { + $pass1->set_sensitive(0); + $pass2->set_sensitive(0); + } elsif ($$formatref eq "TAR") { + $pass1->set_sensitive(0); + $pass2->set_sensitive(0); + } + } + return; +} + +# +# fill given var-reference with value from togglebutton +# +sub toggle_to_var_pref { + my ($button, $var, $value, $box) = @_; + + $$var = $value; + + if(defined($box) && defined($box->{'nb'}->get_current_page())) { + $box->{'button_ok'}->set_sensitive(1); + $box->{'button_apply'}->set_sensitive(1); + } + + return; +} + +1 + diff --git a/lib/GUI/HELPERS.pm b/lib/GUI/HELPERS.pm new file mode 100644 index 0000000..ebe37b4 --- /dev/null +++ b/lib/GUI/HELPERS.pm @@ -0,0 +1,479 @@ +# Copyright (c) Stephan Martin +# +# $Id: HELPERS.pm,v 1.6 2006/06/28 21:50:42 sm Exp $ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + +use strict; +package GUI::HELPERS; + +use POSIX; + +# +# Error message box, kills application +# +sub print_error { + my ($t, $ext) = @_; + + my ($box, $button, $dbutton, $expander, $text, $scrolled, $buffer); + + $button = Gtk2::Button->new_from_stock('gtk-ok'); + $button->signal_connect('clicked', sub { HELPERS::exit_clean(1) }); + $button->can_default(1); + + $box = Gtk2::MessageDialog->new( + undef, [qw/destroy-with-parent modal/], 'error', 'none', $t); + $box->set_default_size(600, 0); + $box->set_resizable(1); + + if(defined($ext)) { + $buffer = Gtk2::TextBuffer->new(); + $buffer->set_text($ext); + + $text = Gtk2::TextView->new_with_buffer($buffer); + $text->set_editable(0); + $text->set_wrap_mode('word'); + + $scrolled = Gtk2::ScrolledWindow->new(undef, undef); + $scrolled->set_policy('never', 'automatic'); + $scrolled->set_shadow_type('etched-in'); + $scrolled->add($text); + + $expander = Gtk2::Expander->new(_("Command Details")); + $expander->add($scrolled); + $box->vbox->add($expander); + } + + $box->add_action_widget($button, 0); + + $box->show_all(); +} + +# +# Warning message box +# +sub print_warning { + my ($t, $ext) = @_; + + my ($box, $button, $dbutton, $expander, $text, $scrolled, $buffer); + + $button = Gtk2::Button->new_from_stock('gtk-ok'); + $button->signal_connect('clicked', sub { $box->destroy() }); + $button->can_default(1); + + $box = Gtk2::MessageDialog->new( + undef, [qw/destroy-with-parent modal/], 'warning', 'none', $t); + $box->set_default_size(600, 0); + $box->set_resizable(1); + + if(defined($ext)) { + $buffer = Gtk2::TextBuffer->new(); + $buffer->set_text($ext); + + $text = Gtk2::TextView->new_with_buffer($buffer); + $text->set_editable(0); + $text->set_wrap_mode('word'); + + $scrolled = Gtk2::ScrolledWindow->new(undef, undef); + $scrolled->set_policy('never', 'automatic'); + $scrolled->set_shadow_type('etched-in'); + $scrolled->add($text); + + $expander = Gtk2::Expander->new(_("Command Details")); + $expander->add($scrolled); + $box->vbox->add($expander); + } + $box->add_action_widget($button, 0); + + $box->show_all(); + + return; +} + +# +# Info message box +# +sub print_info { + my ($t, $ext) = @_; + + my ($box, $button, $dbutton, $buffer, $text, $scrolled, $expander); + + $button = Gtk2::Button->new_from_stock('gtk-ok'); + $button->signal_connect('clicked', sub { $box->destroy() }); + $button->can_default(1); + + $box = Gtk2::MessageDialog->new( + undef, [qw/destroy-with-parent modal/], 'info', 'none', $t); + $box->set_default_size(600, 0); + $box->set_resizable(1); + + if(defined($ext)) { + $buffer = Gtk2::TextBuffer->new(); + $buffer->set_text($ext); + + $text = Gtk2::TextView->new_with_buffer($buffer); + $text->set_editable(0); + $text->set_wrap_mode('word'); + + $scrolled = Gtk2::ScrolledWindow->new(undef, undef); + $scrolled->set_policy('never', 'automatic'); + $scrolled->set_shadow_type('etched-in'); + $scrolled->add($text); + + $expander = Gtk2::Expander->new(_("Command Details")); + $expander->add($scrolled); + $box->vbox->add($expander); + } + $box->add_action_widget($button, 0); + + $box->show_all(); + + return; +} + +# +# create standard dialog box +# +sub dialog_box { + my ($title, $text, $button1, $button2) = @_; + + my $box = Gtk2::Dialog->new($title, undef, ["destroy-with-parent"]); + + $box->add_action_widget($button1, 0); + + if(defined($button2)) { + $box->add_action_widget($button2, 0); + $box->action_area->set_layout('spread'); + } + + if(defined($text)) { + my $label = create_label($text, 'center', 0, 1); + $box->vbox->pack_start($label, 0, 0, 0); + } + + $box->signal_connect(response => sub { $box->destroy }); + + return($box); +} + +# +# create standard label +# +sub create_label { + my ($text, $mode, $wrap, $bold) = @_; + + $text = "$text" if($bold); + + my $label = Gtk2::Label->new($text); + + $label->set_justify($mode); + if($mode eq 'center') { + $label->set_alignment(0.5, 0.5); + }elsif($mode eq 'left') { + $label->set_alignment(0, 0); + }elsif($mode eq 'right') { + $label->set_alignment(1, 1); + } + + $label->set_line_wrap($wrap); + + $label->set_markup($text) if($bold); + + return($label); +} + +# +# write two labels to table +# +sub label_to_table { + my ($key, $val, $table, $row, $mode, $wrap, $bold) = @_; + + my ($label, $entry); + + $label = create_label($key, $mode, $wrap, $bold); + $label->set_padding(20, 0); + $table->attach_defaults($label, 0, 1, $row, $row+1); + + $label = create_label($val, $mode, $wrap, $bold); + $label->set_padding(20, 0); + $table->attach_defaults($label, 1, 2, $row, $row+1); + + $row++; + $table->resize($row, 2); + + return($row); +} + +# +# write label and entry to table +# +sub entry_to_table { + my ($text, $var, $table, $row, $visibility, $box) = @_; + + my ($label, $entry); + + $label = create_label($text, 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $row, $row+1); + + $entry = Gtk2::Entry->new(); + $entry->set_text($$var) if(defined($$var)); + + $table->attach_defaults($entry, 1, 2, $row, $row+1); + $entry->signal_connect('changed' => + sub {GUI::CALLBACK::entry_to_var($entry, $entry, $var, $box)} ); + $entry->set_visibility($visibility); + + return($entry); +} + +# +# sort the table by the clicked column +# +sub sort_clist { + my ($clist, $col) = @_; + + $clist->set_sort_column($col); + $clist->sort(); + + return(1); +} + +sub create_activity_bar { + my ($t) = @_; + + my($box, $bar); + + $box = Gtk2::MessageDialog->new( + undef, [qw/destroy-with-parent modal/], 'info', 'none', $t); + + $bar = Gtk2::ProgressBar->new(); + $bar->pulse(); + $bar->set_pulse_step(0.1); + + $box->vbox->add($bar); + + $box->show_all(); + + return($box, $bar); +} + +# +# set curser busy +# +sub set_cursor { + my $main = shift; + my $busy = shift; + + if($busy) { + $main->{'rootwin'}->set_cursor($main->{'busycursor'}); + } else { + $main->{'rootwin'}->set_cursor($main->{'cursor'}); + } + while(Gtk2->events_pending) { + Gtk2->main_iteration; + } +} + +# +# call file chooser +# +sub browse_file { + my($title, $entry, $mode) = @_; + + my($file_chooser, $filename, $filter); + + $file_chooser = Gtk2::FileChooserDialog->new ($title, undef, $mode, + 'gtk-cancel' => 'cancel', + 'gtk-ok' => 'ok'); + + $file_chooser->add_shortcut_folder ('/tmp'); + + if($mode eq 'open') { + $filter = Gtk2::FileFilter->new(); + $filter->set_name(_("Request Files (*.pem, *.der, *.req)")); + $filter->add_pattern("*.pem"); + $filter->add_pattern("*.der"); + $filter->add_pattern("*.req"); + $file_chooser->add_filter($filter); + + $filter = Gtk2::FileFilter->new(); + $filter->set_name(_("All Files (*.*)")); + $filter->add_pattern("*"); + $file_chooser->add_filter($filter); + } + + if ('ok' eq $file_chooser->run) { + $filename = $file_chooser->get_filename(); + $entry->set_text($filename); + } + + $file_chooser->destroy(); +} + +# +# set text in statusbar +# +sub set_status { + my ($main, $t) = @_; + + $main->{'bar'}->pop($main->{'lastid'}) if(defined($main->{'lastid'})); + $main->{'lastid'} = $main->{'bar'}->get_context_id('gargs'); + $main->{'bar'}->push($main->{'lastid'}, $t); +} + +1 + +__END__ + +=head1 NAME + +GUI::HELPERS - helper functions for TinyCA, doing small jobs related to the +GUI + +=head1 SYNOPSIS + + use GUI::HELPERS; + + GUI::HELPERS::print_info($text, $ext); + GUI::HELPERS::print_warning($text, $ext); + GUI::HELPERS::print_error($text, $ext); + GUI::HELPERS::sort_clist($clist, $col); + GUI::HELPERS::set_cursor($main, $busy); + GUI::HELPERS::browse_file($main, $entry, $mode); + GUI::HELPERS::set_status($main, $text); + + $box = GUI::HELPERS::dialog_box( + $title, $text, $button1, $button2); + $label = GUI::HELPERS::create_label( + $text, $mode, $wrap, $bold); + $row = GUI::HELPERS::label_to_table( + $key, $val, $table, $row, $mode, $wrap, $bold); + $entry = GUI::HELPERS::entry_to_table( + $text, $var, $table, $row, $visibility, $box); + +=head1 DESCRIPTION + +GUI::HELPERS.pm is a library, containing some useful functions used by other +TinyCA2 modules. All functions are related to the GUI. + +=head2 GUI::HELPERS::print_info($text, $ext); + +=over 1 + +creates an Gtk2::MessageDialog of the type info. The string given in $text is +shown as message, the (multiline) string $ext is available through the +"Details" Button. + +=back + +=head2 GUI::HELPERS::print_warning($text, $ext); + +=over 1 + +is identically with GUI::HELPERS::print_warning(), only the +Gtk2::MessageDialog is of type warning. + +=back + +=head2 GUI::HELPERS::print_error($text, $ext); + +=over 1 + +is identically with GUI::HELPERS::print_info(), only the Gtk2::MessageDialogog +is of type error and the program will shut down after closing the message. + +=back + +=head2 GUI::HELPERS::sort_clist($clist, $col); + +=over 1 + +sorts the clist with the values from the given column $col. + +=back + +=head2 GUI::HELPERS::dialog_box($title, $text, $button1, $button2); + +=over 1 + +returns the reference to a new window of type Gtk2::Dialog. $title and +$button1 must be given. $text and $button2 are optional arguments and can be +undef. + +=back + +=head2 GUI::HELPERS::create_label($text, $mode, $wrap, $bold); + +=over 1 + +returns the reference to a new Gtk2::Label. $mode can be "center", "left" or +"right". $wrap and $bold are boolean values. + +=back + +=head2 GUI::HELPERS::label_to_table($key, $val, $table, $row, $mode, $wrap, $bold); + +=over 1 + +adds a new row to $table. The new row is appended at $row and has two columns: +the first will contain a label with the content of string $k, the second the +content of string $v. $mode, $wrap, $bold are the arguments for +GUI::HELPERS::create_label(), mentioned above. +The function returns the number of the next free row in the table. + +=back + +=head2 GUI::HELPERS::entry_to_table($text, $var, $table, $row, $visibility, $box); + +=over 1 + +adds a new row to $table. The new row is appended at $row and has two columns: +the first will contain a label with the content of the string $text, the +second one will contain a textentry Gtk2::Entry, associated with the variable +$var. $visibility controls, if the entered text will be displayed or not +(passwords). +The function returns the reference to the new created entry. + +=back + +=head2 GUI::HELPERS::set_cursor($main, $busy); + +=over 1 + +sets the actual cursor to busy or back to normal. The value of $busy is +boolean. +This functions returns nothing; + +=back + +=head2 GUI::HELPERS::browse_file($main, $entry, $mode); + +=over 1 + +opens a FileChooser dialog to select files or directories. $entry is a +reference to the variable, where the selected path shall be stored. If $mode +is set to "open", then only files with appropriate suffixes are displyed. + +=back + +=head2 GUI::HELPERS::set_status($main, $text); + +=over 1 + +sets the text in $text to the statusbar at the bottom of the window. + +=back + +=cut diff --git a/lib/GUI/TCONFIG.pm b/lib/GUI/TCONFIG.pm new file mode 100644 index 0000000..150e241 --- /dev/null +++ b/lib/GUI/TCONFIG.pm @@ -0,0 +1,1502 @@ +# Copyright (c) Stephan Martin +# +# $Id: TCONFIG.pm,v 1.6 2006/06/28 21:50:42 sm Exp $ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + +use strict; +package GUI::TCONFIG; + +use POSIX; + +# +# main screen for configuration +# +sub show_configbox { + my ($main, $name) = @_; + + my ($box, $vbox, $label, $table, $rows, @options, @options_ca, $entry, + $key, $separator, $t, @combostrings, $button_cancel, + $button_help, $buttonbox, + $combonsCertType, $combosubjectAltName, $combokeyUsage, + $comboextendedKeyUsage, $combonsSslServer, $combonsRevocationUrl, + $combonsRenewalUrl, + $combocnsCertType, $combocsubjectAltName, $combockeyUsage, + $combocextendedKeyUsage, $combocnsSslServer, $combocnsRevocationUrl, + $combocnsRenewalUrl, + $combocansCertType, $combocasubjectAltName, $combocakeyUsage, + $combocaextendedKeyUsage, $combocansSslServer, $combocansRevocationUrl, + $combocansRenewalUrl); + + if(not defined($name)) { + $name = $main->{'CA'}->{'actca'}; + } + if(not defined($name)) { + GUI::HELPERS::print_warning(_("Can't get CA name")); + return; + } + + $main->{'TCONFIG'}->init_config($main, $name); + + $box = Gtk2::Window->new("toplevel"); + $box->set_title("OpenSSL Configuration"); + $box->set_resizable(1); + $box->set_default_size(800, 600); + $box->signal_connect('delete_event' => sub { $box->destroy() }); + + $box->{'button_ok'} = Gtk2::Button->new_from_stock('gtk-ok'); + $box->{'button_ok'}->set_sensitive(0); + $box->{'button_ok'}->signal_connect('clicked' => + sub { $main->{'TCONFIG'}->write_config($main, $name); + $box->destroy() }); + + + $box->{'button_apply'} = Gtk2::Button->new_from_stock('gtk-apply'); + $box->{'button_apply'}->set_sensitive(0); + $box->{'button_apply'}->signal_connect('clicked' => + sub { $main->{'TCONFIG'}->write_config($main, $name) }); + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect( 'clicked' => sub { $box->destroy() }); + + $t = _("All Settings are written unchanged to openssl.conf.\nSo please study the documentation of OpenSSL if you don't know exactly what to do.\nIf you are still unsure - keep the defaults and everything is expected to work fine."); + $button_help = Gtk2::Button->new_from_stock('gtk-help'); + $button_help->signal_connect('clicked' => + sub { GUI::HELPERS::print_info($t) }); + + $box->{'vbox'} = Gtk2::VBox->new(); + + $box->{'nb'} = Gtk2::Notebook->new(); + $box->{'nb'}->set_tab_pos('top'); + $box->{'nb'}->set_show_tabs(1); + $box->{'nb'}->set_show_border(1); + $box->{'nb'}->set_scrollable(0); + + $box->add($box->{'vbox'}); + + $box->{'vbox'}->pack_start($box->{'nb'}, 1, 1, 0); + + $buttonbox = Gtk2::HButtonBox->new(); + $buttonbox->set_layout('end'); + $buttonbox->set_spacing(3); + $buttonbox->set_border_width(3); + $buttonbox->add($button_help); + $buttonbox->set_child_secondary($button_help, 1); + + $buttonbox->add($box->{'button_ok'}); + $buttonbox->add($box->{'button_apply'}); + $buttonbox->add($button_cancel); + + $box->{'vbox'}->pack_start($buttonbox, 0, 0, 0); + + # first page: vbox with warnings :-) + $vbox = Gtk2::VBox->new(0, 0); + + $label = GUI::HELPERS::create_label( + _("OpenSSL Configuration"), 'center', 0,0); + + $box->{'nb'}->append_page($vbox, $label); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label( + _("OpenSSL Configuration"), 'center', 0, 1); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $separator = Gtk2::HSeparator->new(); + $vbox->pack_start($separator, 0, 0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label( + _("Only change these options, if you really know, what you are doing!!"), + 'center', 1, 0); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label( + _("You should be aware, that some options may break some crappy software!!"), + 'center', 1, 0); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + + $label = GUI::HELPERS::create_label( + _("If you are unsure: leave the defaults untouched"), + 'center', 1, 0); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + # second page: server settings + @options = qw( + nsComment + crlDistributionPoints + authorityKeyIdentifier + issuerAltName + nsBaseUrl + nsCaPolicyUrl + ); + + my @special_options = qw( + nsCertType + nsSslServerName + nsRevocationUrl + nsRenewalUrl + subjectAltName + keyUsage + extendedkeyUsage + ); + + @options_ca = qw( + default_days + ); + $vbox = Gtk2::VBox->new(0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label( + _("These Settings are passed to OpenSSL for creating Server Certificates"), + 'center', 0, 1); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label( + _("Multiple Values can be separated by \",\""), + 'center', 1, 0); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $separator = Gtk2::HSeparator->new(); + $vbox->pack_start($separator, 0, 0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $rows = 1; + $table = Gtk2::Table->new($rows, 2, 0); + $vbox->pack_start($table, 1, 1, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label(_("Server Certificate Settings"), + 'center', 0, 0); + $label = Gtk2::Label->new(_("Server Certificate Settings")); + + $box->{'nb'}->append_page($vbox, $label); + + # special option subjectAltName + $label = GUI::HELPERS::create_label( + _("Subject alternative name (subjectAltName):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $main->{'radiobox'} = Gtk2::HBox->new(0, 0); + $main->{'radio1'} = Gtk2::RadioButton->new( + undef, _($main->{'words'}{'ip'})); + $main->{'radio1'}->signal_connect('toggled' => + sub {GUI::CALLBACK::toggle_to_var_pref($main->{'radio1'}, + \$main->{'TCONFIG'}->{'server_cert'}->{'subjectAltNameType'}, 'ip', + $box)}); + + $main->{'radiobox'}->add($main->{'radio1'}); + + $main->{'radio2'} = Gtk2::RadioButton->new( + $main->{'radio1'}, _($main->{'words'}{'dns'})); + $main->{'radio2'}->signal_connect('toggled' => + sub {GUI::CALLBACK::toggle_to_var_pref($main->{'radio2'}, + \$main->{'TCONFIG'}->{'server_cert'}->{'subjectAltNameType'}, + 'dns', $box)}); + + $main->{'radiobox'}->add($main->{'radio2'}); + + $main->{'radio3'} = Gtk2::RadioButton->new($main->{'radio1'}, + _($main->{'words'}{'raw'})); + + $main->{'radio3'}->signal_connect('toggled' => + sub {GUI::CALLBACK::toggle_to_var_pref($main->{'radio3'}, + \$main->{'TCONFIG'}->{'server_cert'}->{'subjectAltNameType'}, + 'raw', $box)}); + + $main->{'radiobox'}->add($main->{'radio3'}); + + if($main->{'TCONFIG'}->{'server_cert'}->{'subjectAltNameType'} + eq 'ip') { + $main->{'radio1'}->set_active(1) + }elsif($main->{'TCONFIG'}->{'server_cert'}->{'subjectAltNameType'} + eq 'dns') { + $main->{'radio2'}->set_active(1) + }elsif($main->{'TCONFIG'}->{'server_cert'}->{'subjectAltNameType'} + eq 'raw') { + $main->{'radio3'}->set_active(1) + } + + $combosubjectAltName = Gtk2::Combo->new(); + @combostrings = ( + $main->{'words'}{'none'}, + $main->{'words'}{'user'}, + $main->{'words'}{'emailcopy'}); + $combosubjectAltName->set_popdown_strings(@combostrings); + $combosubjectAltName->set_use_arrows(1); + $combosubjectAltName->set_value_in_list(1, 0); + + if(defined($main->{'TCONFIG'}->{'server_cert'}->{'subjectAltName'})) { + if($main->{'TCONFIG'}->{'server_cert'}->{'subjectAltName'} + eq 'user') { + $main->{'radio1'}->set_sensitive(1); + $main->{'radio2'}->set_sensitive(1); + $main->{'radio3'}->set_sensitive(1); + + $combosubjectAltName->entry->set_text($main->{'words'}{'user'}); + }elsif($main->{'TCONFIG'}->{'server_cert'}->{'subjectAltName'} + eq 'emailcopy') { + $combosubjectAltName->entry->set_text($main->{'words'}{'emailcopy'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + $main->{'radio3'}->set_sensitive(0); + }elsif($main->{'TCONFIG'}->{'server_cert'}->{'subjectAltName'} + eq 'none') { + $combosubjectAltName->entry->set_text($main->{'words'}{'none'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + $main->{'radio3'}->set_sensitive(0); + } + } else { + $combosubjectAltName->entry->set_text($main->{'words'}{'none'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + $main->{'radio3'}->set_sensitive(0); + } + $combosubjectAltName->entry->signal_connect('changed' => + sub { GUI::CALLBACK::entry_to_var_san( + $combosubjectAltName, + $combosubjectAltName->entry, + \$main->{'TCONFIG'}->{'server_cert'}->{'subjectAltName'}, + $box, + $main->{words}, + $main->{'radio1'}, + $main->{'radio2'}, + $main->{'radio3'})}); + $table->attach_defaults($combosubjectAltName, 1, 2, $rows-1, $rows); + $rows++; + + $table->attach_defaults($main->{'radiobox'}, 1, 2, $rows-1, $rows); + $rows++; + + # special option keyUsage + $label = GUI::HELPERS::create_label( + _("Key Usage (keyUsage):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $main->{'radiobox'} = Gtk2::HBox->new(0, 0); + + $main->{'radio1'} = Gtk2::RadioButton->new(undef, + _($main->{'words'}{'critical'})); + if($main->{'TCONFIG'}->{'server_cert'}->{'keyUsageType'} eq 'critical') { + $main->{'radio1'}->set_active(1) + } + $main->{'radio1'}->signal_connect('toggled' => + sub {GUI::CALLBACK::toggle_to_var_pref($main->{'radio1'}, + \$main->{'TCONFIG'}->{'server_cert'}->{'keyUsageType'}, + 'critical', $box)}); + + $main->{'radiobox'}->add($main->{'radio1'}); + + $main->{'radio2'} = Gtk2::RadioButton->new($main->{'radio1'}, + _($main->{'words'}{'noncritical'})); + if($main->{'TCONFIG'}->{'server_cert'}->{'keyUsageType'} eq 'noncritical') { + $main->{'radio2'}->set_active(1) + } + $main->{'radio2'}->signal_connect('toggled' => + sub {GUI::CALLBACK::toggle_to_var_pref($main->{'radio2'}, + \$main->{'TCONFIG'}->{'server_cert'}->{'keyUsageType'}, + 'noncritical', $box)}); + + $main->{'radiobox'}->add($main->{'radio2'}); + + $combokeyUsage = Gtk2::Combo->new(); + @combostrings = ( + $main->{'words'}{'none'}, + $main->{'words'}{'sig'}, + $main->{'words'}{'key'}, + $main->{'words'}{'keysig'}); + $combokeyUsage->set_popdown_strings(@combostrings); + $combokeyUsage->set_use_arrows(1); + $combokeyUsage->set_value_in_list(1, 0); + + if(defined($main->{'TCONFIG'}->{'server_cert'}->{'keyUsage'})) { + if($main->{'TCONFIG'}->{'server_cert'}->{'keyUsage'} + ne 'none') { + $main->{'radio1'}->set_sensitive(1); + $main->{'radio2'}->set_sensitive(1); + + if($main->{'TCONFIG'}->{'server_cert'}->{'keyUsage'} eq 'sig') { + $combokeyUsage->entry->set_text($main->{'words'}{'sig'}); + }elsif($main->{'TCONFIG'}->{'server_cert'}->{'keyUsage'} eq 'key') { + $combokeyUsage->entry->set_text($main->{'words'}{'key'}); + }elsif($main->{'TCONFIG'}->{'server_cert'}->{'keyUsage'} eq 'keysig') { + $combokeyUsage->entry->set_text($main->{'words'}{'keysig'}); + }else { + $combokeyUsage->entry->set_text($main->{'words'}{'none'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + } + }else { + $combokeyUsage->entry->set_text($main->{'words'}{'none'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + } + } else { + $combokeyUsage->entry->set_text($main->{'words'}{'none'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + } + $combokeyUsage->entry->signal_connect('changed' => + sub { GUI::CALLBACK::entry_to_var_key($combokeyUsage, $combokeyUsage->entry, + \$main->{'TCONFIG'}->{'server_cert'}->{'keyUsage'}, $box, + $main->{words}, $main->{'radio1'}, $main->{'radio2'})}); + + $table->attach_defaults($combokeyUsage, 1, 2, $rows-1, $rows); + $rows++; + + $table->attach_defaults($main->{'radiobox'}, 1, 2, $rows-1, $rows); + $rows++; + + # special option extendedKeyUsage + $label = GUI::HELPERS::create_label( + _("Extended Key Usage (extendedKeyUsage):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $main->{'radiobox'} = Gtk2::HBox->new(0, 0); + $main->{'radio1'} = Gtk2::RadioButton->new(undef, + _($main->{'words'}{'critical'})); + if($main->{'TCONFIG'}->{'server_cert'}->{'extendedKeyUsageType'} eq 'critical') { + $main->{'radio1'}->set_active(1) + } + $main->{'radio1'}->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var_pref($main->{'radio1'}, + \$main->{'TCONFIG'}->{'server_cert'}->{'extendedKeyUsageType'}, + 'critical', $box)}); + $main->{'radiobox'}->add($main->{'radio1'}); + + $main->{'radio2'} = Gtk2::RadioButton->new($main->{'radio1'}, + _($main->{'words'}{'noncritical'})); + if($main->{'TCONFIG'}->{'server_cert'}->{'extendedKeyUsageType'} eq 'noncritical') { + $main->{'radio2'}->set_active(1) + } + $main->{'radio2'}->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var_pref($main->{'radio2'}, + \$main->{'TCONFIG'}->{'server_cert'}->{'extendedKeyUsageType'}, + 'noncritical', $box)}); + $main->{'radiobox'}->add($main->{'radio2'}); + + $comboextendedKeyUsage = Gtk2::Combo->new(); + @combostrings = ( + $main->{'words'}{'none'}, + $main->{'words'}{'user'}); + + if((defined($main->{'TCONFIG'}->{'server_cert'}->{'extendedKeyUsage'})) && + ($main->{'TCONFIG'}->{'server_cert'}->{'extendedKeyUsage'} ne 'none') && + ($main->{'TCONFIG'}->{'server_cert'}->{'extendedKeyUsage'} ne '')) { + push(@combostrings, + $main->{'TCONFIG'}->{'server_cert'}->{'extendedKeyUsage'}); + } + + $comboextendedKeyUsage->set_popdown_strings(@combostrings); + $comboextendedKeyUsage->set_use_arrows(1); + $comboextendedKeyUsage->set_value_in_list(0, 0); + + if(defined($main->{'TCONFIG'}->{'server_cert'}->{'extendedKeyUsage'})) { + if($main->{'TCONFIG'}->{'server_cert'}->{'extendedKeyUsage'} + ne 'none') { + $main->{'radio1'}->set_sensitive(1); + $main->{'radio2'}->set_sensitive(1); + + if($main->{'TCONFIG'}->{'server_cert'}->{'extendedKeyUsage'} eq 'user'){ + $comboextendedKeyUsage->entry->set_text($main->{'words'}{'user'}); + } else { + $comboextendedKeyUsage->entry->set_text($main->{'TCONFIG'}->{'server_cert'}->{'extendedKeyUsage'}); + } + } else { + $comboextendedKeyUsage->entry->set_text($main->{'words'}{'none'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + } + } else { + $comboextendedKeyUsage->entry->set_text($main->{'words'}{'none'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + } + $comboextendedKeyUsage->entry->signal_connect('changed' => + sub { GUI::CALLBACK::entry_to_var_key($comboextendedKeyUsage, $comboextendedKeyUsage->entry, + \$main->{'TCONFIG'}->{'server_cert'}->{'extendedKeyUsage'}, $box, + $main->{words}, $main->{'radio1'}, $main->{'radio2'}) }); + + $table->attach_defaults($comboextendedKeyUsage, 1, 2, $rows-1, $rows); + $rows++; + + $table->attach_defaults($main->{'radiobox'}, 1, 2, $rows-1, $rows); + $rows++; + + # special option nsCerttype + $label = GUI::HELPERS::create_label( + _("Netscape Certificate Type (nsCertType):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $combonsCertType = Gtk2::Combo->new(); + @combostrings = ( + $main->{'words'}{'none'}, + $main->{'words'}{'server'}, + $main->{'words'}{'server, client'}); + + $combonsCertType->set_popdown_strings(@combostrings); + $combonsCertType->set_use_arrows(1); + $combonsCertType->set_value_in_list(1, 0); + + if(defined($main->{'TCONFIG'}->{'server_cert'}->{'nsCertType'})) { + $combonsCertType->entry->set_text( + $main->{'words'}{$main->{'TCONFIG'}->{'server_cert'}->{'nsCertType'}}); + } else { + $combonsCertType->entry->set_text($main->{'words'}{'none'}); + } + $combonsCertType->entry->signal_connect('changed' => + sub { GUI::CALLBACK::entry_to_var($combonsCertType, $combonsCertType->entry, + \$main->{'TCONFIG'}->{'server_cert'}->{'nsCertType'}, $box, + $main->{words}) }); + + $table->attach_defaults($combonsCertType, 1, 2, $rows-1, $rows); + $rows++; + + # special option nsSslServer + $label = GUI::HELPERS::create_label( + _("Netscape SSL Server Name (nsSslServerName):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $combonsSslServer = Gtk2::Combo->new(); + @combostrings = ($main->{'words'}{'none'}, $main->{'words'}{'user'}); + $combonsSslServer->set_popdown_strings(@combostrings); + $combonsSslServer->set_use_arrows(1); + $combonsSslServer->set_value_in_list(1, 0); + if(defined($main->{'TCONFIG'}->{'server_cert'}->{'nsSslServerName'}) && + $main->{'TCONFIG'}->{'server_cert'}->{'nsSslServerName'} + eq 'user') { + $combonsSslServer->entry->set_text($main->{'words'}{'user'}); + } else { + $combonsSslServer->entry->set_text($main->{'words'}{'none'}); + } + $combonsSslServer->entry->signal_connect('changed' => + sub { GUI::CALLBACK::entry_to_var($combonsSslServer, $combonsSslServer->entry, + \$main->{'TCONFIG'}->{'server_cert'}->{'nsSslServerName'}, $box, + $main->{words}) }); + + $table->attach_defaults($combonsSslServer, 1, 2, $rows-1, $rows); + $rows++; + + # special option nsRevocationUrl + $label = GUI::HELPERS::create_label( + _("Netscape Revocation URL (nsRevocationUrl):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $combonsRevocationUrl = Gtk2::Combo->new(); + @combostrings = ($main->{'words'}{'none'}, $main->{'words'}{'user'}); + $combonsRevocationUrl->set_popdown_strings(@combostrings); + $combonsRevocationUrl->set_use_arrows(1); + $combonsRevocationUrl->set_value_in_list(1, 0); + if(defined($main->{'TCONFIG'}->{'server_cert'}->{'nsRevocationUrl'}) && + $main->{'TCONFIG'}->{'server_cert'}->{'nsRevocationUrl'} + eq 'user') { + $combonsRevocationUrl->entry->set_text($main->{'words'}{'user'}); + } else { + $combonsRevocationUrl->entry->set_text($main->{'words'}{'none'}); + } + $combonsRevocationUrl->entry->signal_connect('changed' => + sub { GUI::CALLBACK::entry_to_var($combonsRevocationUrl, $combonsRevocationUrl->entry, + \$main->{'TCONFIG'}->{'server_cert'}->{'nsRevocationUrl'}, $box, + $main->{words}) }); + + $table->attach_defaults($combonsRevocationUrl, 1, 2, $rows-1, $rows); + $rows++; + + # special option nsRenewalUrl + $label = GUI::HELPERS::create_label( + _("Netscape Renewal URL (nsRenewalUrl):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $combonsRenewalUrl = Gtk2::Combo->new(); + @combostrings = ($main->{'words'}{'none'}, $main->{'words'}{'user'}); + $combonsRenewalUrl->set_popdown_strings(@combostrings); + $combonsRenewalUrl->set_use_arrows(1); + $combonsRenewalUrl->set_value_in_list(1, 0); + if(defined($main->{'TCONFIG'}->{'server_cert'}->{'nsRenewalUrl'}) && + $main->{'TCONFIG'}->{'server_cert'}->{'nsRenewalUrl'} + eq 'user') { + $combonsRenewalUrl->entry->set_text($main->{'words'}{'user'}); + } else { + $combonsRenewalUrl->entry->set_text($main->{'words'}{'none'}); + } + $combonsRenewalUrl->entry->signal_connect('changed' => + sub { GUI::CALLBACK::entry_to_var($combonsRenewalUrl, $combonsRenewalUrl->entry, + \$main->{'TCONFIG'}->{'server_cert'}->{'nsRenewalUrl'}, $box, + $main->{words}) }); + + $table->attach_defaults($combonsRenewalUrl, 1, 2, $rows-1, $rows); + $rows++; + + # standard options + foreach $key (@options) { + $entry = GUI::HELPERS::entry_to_table("$key:", + \$main->{'TCONFIG'}->{'server_cert'}->{$key}, + $table, $rows-1, 1, $box); + + $rows++; + $table->resize($rows, 2); + } + + foreach $key (@options_ca) { + $entry = GUI::HELPERS::entry_to_table("$key:", + \$main->{'TCONFIG'}->{'server_ca'}->{$key}, + $table, $rows-1, 1, $box); + + $rows++; + $table->resize($rows, 2); + } + + # third page: client settings + @options = qw( + nsComment + crlDistributionPoints + authorityKeyIdentifier + issuerAltName + nsBaseUrl + nsCaPolicyUrl + ); + + @options_ca = qw( + default_days + ); + $vbox = Gtk2::VBox->new(0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label( + _("These Settings are passed to OpenSSL for creating Client Certificates"), + 'center', 0, 1); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label( + _("Multiple Values can be separated by \",\""), + 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $separator = Gtk2::HSeparator->new(); + $vbox->pack_start($separator, 0, 0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $rows = 1; + $table = Gtk2::Table->new($rows, 2, 0); + $vbox->pack_start($table, 1, 1, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label(_("Client Certificate Settings"), + 'center', 0, 0); + $box->{'nb'}->append_page($vbox, $label); + + # special option subjectAltName + $label = GUI::HELPERS::create_label( + _("Subject alternative name (subjectAltName):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $main->{'radiobox'} = Gtk2::HBox->new(0, 0); + $main->{'radio1'} = Gtk2::RadioButton->new(undef, + _($main->{'words'}{'ip'})); + $main->{'radio1'}->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var_pref($main->{'radio1'}, + \$main->{'TCONFIG'}->{'client_cert'}->{'subjectAltNameType'}, + 'ip', $box) }); + $main->{'radiobox'}->add($main->{'radio1'}); + + $main->{'radio2'} = Gtk2::RadioButton->new($main->{'radio1'}, + _($main->{'words'}{'dns'})); + $main->{'radio2'}->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var_pref($main->{'radio2'}, + \$main->{'TCONFIG'}->{'client_cert'}->{'subjectAltNameType'}, + 'dns', $box) }); + $main->{'radiobox'}->add($main->{'radio2'}); + + $main->{'radio3'} = Gtk2::RadioButton->new($main->{'radio1'}, + _($main->{'words'}{'mail'})); + $main->{'radio3'}->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var_pref($main->{'radio3'}, + \$main->{'TCONFIG'}->{'client_cert'}->{'subjectAltNameType'}, + 'mail', $box) }); + $main->{'radiobox'}->add($main->{'radio3'}); + + $main->{'radio4'} = Gtk2::RadioButton->new($main->{'radio1'}, + _($main->{'words'}{'raw'})); + $main->{'radio4'}->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var_pref($main->{'radio4'}, + \$main->{'TCONFIG'}->{'client_cert'}->{'subjectAltNameType'}, + 'raw', $box) }); + $main->{'radiobox'}->add($main->{'radio4'}); + + if($main->{'TCONFIG'}->{'client_cert'}->{'subjectAltNameType'} + eq 'ip') { + $main->{'radio1'}->set_active(1) + }elsif($main->{'TCONFIG'}->{'client_cert'}->{'subjectAltNameType'} + eq 'dns') { + $main->{'radio2'}->set_active(1) + }elsif($main->{'TCONFIG'}->{'client_cert'}->{'subjectAltNameType'} + eq 'mail') { + $main->{'radio3'}->set_active(1) + }elsif($main->{'TCONFIG'}->{'client_cert'}->{'subjectAltNameType'} + eq 'raw') { + $main->{'radio4'}->set_active(1) + } + + $combocsubjectAltName = Gtk2::Combo->new(); + @combostrings = ( + $main->{'words'}{'none'}, + $main->{'words'}{'user'}, + $main->{'words'}{'emailcopy'}); + $combocsubjectAltName->set_popdown_strings(@combostrings); + $combocsubjectAltName->set_use_arrows(1); + $combocsubjectAltName->set_value_in_list(1, 0); + + if(defined($main->{'TCONFIG'}->{'client_cert'}->{'subjectAltName'})) { + if($main->{'TCONFIG'}->{'client_cert'}->{'subjectAltName'} + eq 'user') { + $main->{'radio1'}->set_sensitive(1); + $main->{'radio2'}->set_sensitive(1); + $main->{'radio3'}->set_sensitive(1); + $main->{'radio4'}->set_sensitive(1); + + $combocsubjectAltName->entry->set_text($main->{'words'}{'user'}); + }elsif($main->{'TCONFIG'}->{'client_cert'}->{'subjectAltName'} + eq 'emailcopy') { + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + $main->{'radio3'}->set_sensitive(0); + $main->{'radio4'}->set_sensitive(1); + + $combocsubjectAltName->entry->set_text($main->{'words'}{'emailcopy'}); + }elsif($main->{'TCONFIG'}->{'client_cert'}->{'subjectAltName'} + eq 'none') { + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + $main->{'radio3'}->set_sensitive(0); + $main->{'radio4'}->set_sensitive(1); + + $combocsubjectAltName->entry->set_text($main->{'words'}{'none'}); + } + } else { + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + $main->{'radio3'}->set_sensitive(0); + $main->{'radio4'}->set_sensitive(1); + + $combocsubjectAltName->entry->set_text($main->{'words'}{'none'}); + } + $combocsubjectAltName->entry->signal_connect('changed' => + sub { GUI::CALLBACK::entry_to_var_san($combocsubjectAltName, $combocsubjectAltName->entry, + \$main->{'TCONFIG'}->{'client_cert'}->{'subjectAltName'}, $box, + $main->{words}, $main->{'radio1'}, $main->{'radio2'}, + $main->{'radio3'}, $main->{'radio4'}) }); + $table->attach_defaults($combocsubjectAltName, 1, 2, $rows-1, $rows); + $rows++; + + $table->attach_defaults($main->{'radiobox'}, 1, 2, $rows-1, $rows); + $rows++; + + # special option keyUsage + $label = GUI::HELPERS::create_label( + _("Key Usage (keyUsage):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $main->{'radiobox'} = Gtk2::HBox->new(0, 0); + $main->{'radio1'} = Gtk2::RadioButton->new(undef, + _($main->{'words'}{'critical'})); + if($main->{'TCONFIG'}->{'client_cert'}->{'keyUsageType'} eq 'critical') { + $main->{'radio1'}->set_active(1) + } + $main->{'radio1'}->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var_pref($main->{'radio1'}, + \$main->{'TCONFIG'}->{'client_cert'}->{'keyUsageType'}, + 'critical', $box) }); + $main->{'radiobox'}->add($main->{'radio1'}); + + $main->{'radio2'} = Gtk2::RadioButton->new($main->{'radio1'}, + _($main->{'words'}{'noncritical'})); + if($main->{'TCONFIG'}->{'client_cert'}->{'keyUsageType'} eq 'noncritical') { + $main->{'radio2'}->set_active(1) + } + $main->{'radio2'}->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var_pref($main->{'radio2'}, + \$main->{'TCONFIG'}->{'client_cert'}->{'keyUsageType'}, + 'noncritical', $box) }); + $main->{'radiobox'}->add($main->{'radio2'}); + + $combockeyUsage = Gtk2::Combo->new(); + @combostrings = ( + $main->{'words'}{'none'}, + $main->{'words'}{'sig'}, + $main->{'words'}{'key'}, + $main->{'words'}{'keysig'}); + $combockeyUsage->set_popdown_strings(@combostrings); + $combockeyUsage->set_use_arrows(1); + $combockeyUsage->set_value_in_list(1, 0); + + if(defined($main->{'TCONFIG'}->{'client_cert'}->{'keyUsage'})) { + if($main->{'TCONFIG'}->{'client_cert'}->{'keyUsage'} + ne 'none') { + $main->{'radio1'}->set_sensitive(1); + $main->{'radio2'}->set_sensitive(1); + + if($main->{'TCONFIG'}->{'client_cert'}->{'keyUsage'} eq 'sig') { + $combockeyUsage->entry->set_text($main->{'words'}{'sig'}); + }elsif($main->{'TCONFIG'}->{'client_cert'}->{'keyUsage'} eq 'key') { + $combockeyUsage->entry->set_text($main->{'words'}{'key'}); + }elsif($main->{'TCONFIG'}->{'client_cert'}->{'keyUsage'} eq 'keysig') { + $combockeyUsage->entry->set_text($main->{'words'}{'keysig'}); + }else { + $combockeyUsage->entry->set_text($main->{'words'}{'none'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + } + }else { + $combockeyUsage->entry->set_text($main->{'words'}{'none'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + } + } else { + $combockeyUsage->entry->set_text($main->{'words'}{'none'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + } + $combockeyUsage->entry->signal_connect('changed' => + sub { GUI::CALLBACK::entry_to_var_key($combockeyUsage, $combockeyUsage->entry, + \$main->{'TCONFIG'}->{'client_cert'}->{'keyUsage'}, $box, + $main->{words}, $main->{'radio1'}, $main->{'radio2'}) }); + $table->attach_defaults($combockeyUsage, 1, 2, $rows-1, $rows); + $rows++; + + $table->attach_defaults($main->{'radiobox'}, 1, 2, $rows-1, $rows); + $rows++; + + # special option extendedKeyUsage + $label = GUI::HELPERS::create_label( + _("Extended Key Usage (extendedKeyUsage):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $main->{'radiobox'} = Gtk2::HBox->new(0, 0); + $main->{'radio1'} = Gtk2::RadioButton->new(undef, + _($main->{'words'}{'critical'})); + if($main->{'TCONFIG'}->{'client_cert'}->{'extendedKeyUsageType'} eq 'critical') { + $main->{'radio1'}->set_active(1) + } + $main->{'radio1'}->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var_pref($main->{'radio1'}, + \$main->{'TCONFIG'}->{'client_cert'}->{'extendedKeyUsageType'}, + 'critical', $box) }); + $main->{'radiobox'}->add($main->{'radio1'}); + + $main->{'radio2'} = Gtk2::RadioButton->new($main->{'radio1'}, + _($main->{'words'}{'noncritical'})); + if($main->{'TCONFIG'}->{'client_cert'}->{'extendedKeyUsageType'} eq 'noncritical') { + $main->{'radio2'}->set_active(1) + } + $main->{'radio2'}->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var_pref( $main->{'radio2'}, + \$main->{'TCONFIG'}->{'client_cert'}->{'extendedKeyUsageType'}, + 'noncritical', $box) }); + $main->{'radiobox'}->add($main->{'radio2'}); + + $combocextendedKeyUsage = Gtk2::Combo->new(); + @combostrings = ( + $main->{'words'}{'none'}, + $main->{'words'}{'user'}); + + if((defined($main->{'TCONFIG'}->{'client_cert'}->{'extendedKeyUsage'})) && + ($main->{'TCONFIG'}->{'client_cert'}->{'extendedKeyUsage'} ne 'none') && + ($main->{'TCONFIG'}->{'client_cert'}->{'extendedKeyUsage'} ne '')) { + push(@combostrings, + $main->{'TCONFIG'}->{'client_cert'}->{'extendedKeyUsage'}); + } + + $combocextendedKeyUsage->set_popdown_strings(@combostrings); + $combocextendedKeyUsage->set_use_arrows(1); + $combocextendedKeyUsage->set_value_in_list(0, 0); + + if(defined($main->{'TCONFIG'}->{'client_cert'}->{'extendedKeyUsage'})) { + if($main->{'TCONFIG'}->{'client_cert'}->{'extendedKeyUsage'} + ne 'none') { + $main->{'radio1'}->set_sensitive(1); + $main->{'radio2'}->set_sensitive(1); + + if($main->{'TCONFIG'}->{'client_cert'}->{'extendedKeyUsage'} eq 'user'){ + $combocextendedKeyUsage->entry->set_text($main->{'words'}{'user'}); + } else { + $combocextendedKeyUsage->entry->set_text($main->{'TCONFIG'}->{'client_cert'}->{'extendedKeyUsage'}); + } + } else { + $combocextendedKeyUsage->entry->set_text($main->{'words'}{'none'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + } + } else { + $combocextendedKeyUsage->entry->set_text($main->{'words'}{'none'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + } + $combocextendedKeyUsage->entry->signal_connect('changed' => + sub { GUI::CALLBACK::entry_to_var_key($combocextendedKeyUsage, $combocextendedKeyUsage->entry, + \$main->{'TCONFIG'}->{'client_cert'}->{'extendedKeyUsage'}, $box, + $main->{words}, $main->{'radio1'}, $main->{'radio2'}) }); + $table->attach_defaults($combocextendedKeyUsage, 1, 2, $rows-1, $rows); + $rows++; + + $table->attach_defaults($main->{'radiobox'}, 1, 2, $rows-1, $rows); + $rows++; + + # special option nsCerttype + $label = GUI::HELPERS::create_label( + _("Netscape Certificate Type (nsCertType):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $combocnsCertType = Gtk2::Combo->new(); + @combostrings = ( + $main->{'words'}{'none'}, + $main->{'words'}{'objsign'}, + $main->{'words'}{'email'}, + $main->{'words'}{'client'}, + $main->{'words'}{'client, email'}, + $main->{'words'}{'client, objsign'}, + $main->{'words'}{'client, email, objsign'}); + $combocnsCertType->set_popdown_strings(@combostrings); + $combocnsCertType->set_use_arrows(1); + $combocnsCertType->set_value_in_list(1, 0); + if(defined($main->{'TCONFIG'}->{'client_cert'}->{'nsCertType'})) { + $combocnsCertType->entry->set_text( + $main->{'words'}{$main->{'TCONFIG'}->{'client_cert'}->{'nsCertType'}}); + } else { + $combocnsCertType->entry->set_text($main->{'words'}{'none'}); + } + $combocnsCertType->entry->signal_connect('changed' => + sub { GUI::CALLBACK::entry_to_var($combocnsCertType, $combocnsCertType->entry, + \$main->{'TCONFIG'}->{'client_cert'}->{'nsCertType'}, $box, + $main->{words}) }); + $table->attach_defaults($combocnsCertType, 1, 2, $rows-1, $rows); + $rows++; + + # special option nsRevocationUrl + $label = GUI::HELPERS::create_label( + _("Netscape Revocation URL (nsRevocationUrl):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $combocnsRevocationUrl = Gtk2::Combo->new(); + @combostrings = ($main->{'words'}{'none'}, $main->{'words'}{'user'}); + $combocnsRevocationUrl->set_popdown_strings(@combostrings); + $combocnsRevocationUrl->set_use_arrows(1); + $combocnsRevocationUrl->set_value_in_list(1, 0); + if(defined($main->{'TCONFIG'}->{'client_cert'}->{'nsRevocationUrl'}) && + $main->{'TCONFIG'}->{'client_cert'}->{'nsRevocationUrl'} + eq 'user') { + $combocnsRevocationUrl->entry->set_text($main->{'words'}{'user'}); + } else { + $combocnsRevocationUrl->entry->set_text($main->{'words'}{'none'}); + } + $combocnsRevocationUrl->entry->signal_connect('changed' => + sub { GUI::CALLBACK::entry_to_var($combocnsRevocationUrl, $combocnsRevocationUrl->entry, + \$main->{'TCONFIG'}->{'client_cert'}->{'nsRevocationUrl'}, $box, + $main->{words}) }); + $table->attach_defaults($combocnsRevocationUrl, 1, 2, $rows-1, $rows); + $rows++; + + # special option nsRenewalUrl + $label = GUI::HELPERS::create_label( + _("Netscape Renewal URL (nsRenewalUrl):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $combocnsRenewalUrl = Gtk2::Combo->new(); + @combostrings = ($main->{'words'}{'none'}, $main->{'words'}{'user'}); + $combocnsRenewalUrl->set_popdown_strings(@combostrings); + $combocnsRenewalUrl->set_use_arrows(1); + $combocnsRenewalUrl->set_value_in_list(1, 0); + if(defined($main->{'TCONFIG'}->{'client_cert'}->{'nsRenewalUrl'}) && + $main->{'TCONFIG'}->{'client_cert'}->{'nsRenewalUrl'} + eq 'user') { + $combocnsRenewalUrl->entry->set_text($main->{'words'}{'user'}); + } else { + $combocnsRenewalUrl->entry->set_text($main->{'words'}{'none'}); + } + $combocnsRenewalUrl->entry->signal_connect('changed' => + sub { GUI::CALLBACK::entry_to_var($combocnsRenewalUrl, $combocnsRenewalUrl->entry, + \$main->{'TCONFIG'}->{'client_cert'}->{'nsRenewalUrl'}, $box, + $main->{words}) }); + $table->attach_defaults($combocnsRenewalUrl, 1, 2, $rows-1, $rows); + $rows++; + + # standard options + foreach $key (@options) { + $entry = GUI::HELPERS::entry_to_table("$key:", + \$main->{'TCONFIG'}->{'client_cert'}->{$key}, + $table, $rows-1, 1, $box); + + $rows++; + $table->resize($rows, 2); + } + + foreach $key (@options_ca) { + $entry = GUI::HELPERS::entry_to_table("$key:", + \$main->{'TCONFIG'}->{'client_ca'}->{$key}, + $table, $rows-1, 1, $box); + + $rows++; + $table->resize($rows, 2); + } + + # fourth page: ca settings + @options = qw( + nsComment + crlDistributionPoints + authorityKeyIdentifier + issuerAltName + nsBaseUrl + nsCaPolicyUrl + ); + + @special_options = qw( + nsCertType + nsRevocationUrl + subjectAltName + ); + + @options_ca = qw( + default_days + ); + $vbox = Gtk2::VBox->new(0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label( + _("These Settings are passed to OpenSSL for creating CA Certificates"), + 'center', 0, 1); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label( + _("Multiple Values can be separated by \",\""), + 'center', 1, 0); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $separator = Gtk2::HSeparator->new(); + $vbox->pack_start($separator, 0, 0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $rows = 1; + $table = Gtk2::Table->new($rows, 2, 0); + $vbox->pack_start($table, 1, 1, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label(_("CA Certificate Settings"), + 'center', 0, 0); + $label = Gtk2::Label->new(_("CA Certificate Settings")); + + $box->{'nb'}->append_page($vbox, $label); + + # special option subjectAltName + $label = GUI::HELPERS::create_label( + _("Subject alternative name (subjectAltName):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $combocasubjectAltName = Gtk2::Combo->new(); + @combostrings = ($main->{'words'}{'none'}, $main->{'words'}{'emailcopy'}); + $combocasubjectAltName->set_popdown_strings(@combostrings); + $combocasubjectAltName->set_use_arrows(1); + $combocasubjectAltName->set_value_in_list(1, 0); + + if(defined($main->{'TCONFIG'}->{'v3_ca'}->{'subjectAltName'})) { + if($main->{'TCONFIG'}->{'v3_ca'}->{'subjectAltName'} + eq 'emailcopy') { + $combocasubjectAltName->entry->set_text($main->{'words'}{'emailcopy'}); + }elsif($main->{'TCONFIG'}->{'v3_ca'}->{'subjectAltName'} + eq 'none') { + $combocasubjectAltName->entry->set_text($main->{'words'}{'none'}); + } + } else { + $combocasubjectAltName->entry->set_text($main->{'words'}{'none'}); + } + $combocasubjectAltName->entry->signal_connect('changed' => + sub { GUI::CALLBACK::entry_to_var_san($combocasubjectAltName, + $combocasubjectAltName->entry, \$main->{'TCONFIG'}->{'v3_ca'}->{'subjectAltName'}, + $box, $main->{words}) }); + $table->attach_defaults($combocasubjectAltName, 1, 2, $rows-1, $rows); + $rows++; + + # special option nsCerttype + $label = GUI::HELPERS::create_label( + _("Netscape Certificate Type (nsCertType):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $combocansCertType = Gtk2::Combo->new(); + @combostrings = ($main->{'words'}{'none'}, + $main->{'words'}{'emailCA'}, + $main->{'words'}{'sslCA'}, + $main->{'words'}{'objCA'}, + $main->{'words'}{'sslCA, emailCA'}, + $main->{'words'}{'sslCA, objCA'}, + $main->{'words'}{'emailCA, objCA'}, + $main->{'words'}{'sslCA, emailCA, objCA'} + ); + $combocansCertType->set_popdown_strings(@combostrings); + $combocansCertType->set_use_arrows(1); + $combocansCertType->set_value_in_list(1, 0); + if(defined($main->{'TCONFIG'}->{'v3_ca'}->{'nsCertType'})) { + $combocansCertType->entry->set_text( + $main->{'words'}{$main->{'TCONFIG'}->{'v3_ca'}->{'nsCertType'}}); + } else { + $combocansCertType->entry->set_text($main->{'words'}{'none'}); + } + $combocansCertType->entry->signal_connect('changed' => + sub { GUI::CALLBACK::entry_to_var($combocansCertType, $combocansCertType->entry, + \$main->{'TCONFIG'}->{'v3_ca'}->{'nsCertType'}, $box, + $main->{words}) }); + $table->attach_defaults($combocansCertType, 1, 2, $rows-1, $rows); + $rows++; + + # special option keyUsage + $label = GUI::HELPERS::create_label( + _("Key Usage (keyUsage):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $main->{'radiobox'} = Gtk2::HBox->new(0, 0); + $main->{'radio1'} = Gtk2::RadioButton->new(undef, + _($main->{'words'}{'critical'})); + if($main->{'TCONFIG'}->{'v3_ca'}->{'keyUsageType'} eq 'critical') { + $main->{'radio1'}->set_active(1) + } + $main->{'radio1'}->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var_pref($main->{'radio1'}, + \$main->{'TCONFIG'}->{'v3_ca'}->{'keyUsageType'}, 'critical', + $box) }); + $main->{'radiobox'}->add($main->{'radio1'}); + + $main->{'radio2'} = Gtk2::RadioButton->new($main->{'radio1'}, + _($main->{'words'}{'noncritical'})); + if($main->{'TCONFIG'}->{'v3_ca'}->{'keyUsageType'} eq 'noncritical') { + $main->{'radio2'}->set_active(1) + } + $main->{'radio2'}->signal_connect('toggled' => + sub { GUI::CALLBACK::toggle_to_var_pref($main->{'radio2'}, + \$main->{'TCONFIG'}->{'v3_ca'}->{'keyUsageType'}, 'noncritical', + $box) }); + $main->{'radiobox'}->add($main->{'radio2'}); + + $combocakeyUsage = Gtk2::Combo->new(); + @combostrings = ($main->{'words'}{'none'}, + $main->{'words'}{'keyCertSign'}, + $main->{'words'}{'cRLSign'}, + $main->{'words'}{'keyCertSign, cRLSign'}); + $combocakeyUsage->set_popdown_strings(@combostrings); + $combocakeyUsage->set_use_arrows(1); + $combocakeyUsage->set_value_in_list(1, 0); + + if(defined($main->{'TCONFIG'}->{'v3_ca'}->{'keyUsage'})) { + if($main->{'TCONFIG'}->{'v3_ca'}->{'keyUsage'} + ne 'none') { + $main->{'radio1'}->set_sensitive(1); + $main->{'radio2'}->set_sensitive(1); + + if($main->{'TCONFIG'}->{'v3_ca'}->{'keyUsage'} eq 'keyCertSign') { + $combocakeyUsage->entry->set_text($main->{'words'}{'keyCertSign'}); + }elsif($main->{'TCONFIG'}->{'v3_ca'}->{'keyUsage'} eq 'cRLSign') { + $combocakeyUsage->entry->set_text($main->{'words'}{'cRLSign'}); + }elsif($main->{'TCONFIG'}->{'v3_ca'}->{'keyUsage'} eq + 'keyCertSign, cRLSign') { + $combocakeyUsage->entry->set_text($main->{'words'}{'keyCertSign, cRLSign'}); + }else { + $combocakeyUsage->entry->set_text($main->{'words'}{'none'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + } + }else { + $combocakeyUsage->entry->set_text($main->{'words'}{'none'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + } + } else { + $combocakeyUsage->entry->set_text($main->{'words'}{'none'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + } + $combocakeyUsage->entry->signal_connect('changed' => + sub { GUI::CALLBACK::entry_to_var_key($combocakeyUsage, $combocakeyUsage->entry, + \$main->{'TCONFIG'}->{'v3_ca'}->{'keyUsage'}, $box, $main->{words}, + $main->{'radio1'}, $main->{'radio2'}) }); + $table->attach_defaults($combocakeyUsage, 1, 2, $rows-1, $rows); + $rows++; + + $table->attach_defaults($main->{'radiobox'}, 1, 2, $rows-1, $rows); + $rows++; + + # special option nsRevocationUrl + $label = GUI::HELPERS::create_label( + _("Netscape Revocation URL (nsRevocationUrl):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $combocansRevocationUrl = Gtk2::Combo->new(); + @combostrings = ($main->{'words'}{'none'}, $main->{'words'}{'user'}); + $combocansRevocationUrl->set_popdown_strings(@combostrings); + $combocansRevocationUrl->set_use_arrows(1); + $combocansRevocationUrl->set_value_in_list(1, 0); + if(defined($main->{'TCONFIG'}->{'v3_ca'}->{'nsRevocationUrl'}) && + $main->{'TCONFIG'}->{'v3_ca'}->{'nsRevocationUrl'} + eq 'user') { + $combocansRevocationUrl->entry->set_text($main->{'words'}{'user'}); + } else { + $combocansRevocationUrl->entry->set_text($main->{'words'}{'none'}); + } + $combocansRevocationUrl->entry->signal_connect('changed' => + sub { GUI::CALLBACK::entry_to_var($combocansRevocationUrl, $combocansRevocationUrl->entry, + \$main->{'TCONFIG'}->{'v3_ca'}->{'nsRevocationUrl'}, $box, + $main->{words}) }); + $table->attach_defaults($combocansRevocationUrl, 1, 2, $rows-1, $rows); + $rows++; + + # standard options + foreach $key (@options) { + $entry = GUI::HELPERS::entry_to_table("$key:", + \$main->{'TCONFIG'}->{'v3_ca'}->{$key}, + $table, $rows-1, 1, $box); + + $rows++; + $table->resize($rows, 2); + } + + foreach $key (@options_ca) { + $entry = GUI::HELPERS::entry_to_table("$key:", + \$main->{'TCONFIG'}->{'ca_ca'}->{$key}, + $table, $rows-1, 1, $box); + + $rows++; + $table->resize($rows, 2); + } + + # fifth page: crl settings + @options = qw( + default_crl_days + ); + + $vbox = Gtk2::VBox->new(0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label( + _("These Settings are passed to OpenSSL for creating Certificate Revocation Lists"), + 'center', 0, 1); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label( + _("Multiple Values can be separated by \",\""), + 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $separator = Gtk2::HSeparator->new(); + $vbox->pack_start($separator, 0, 0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $rows = 1; + $table = Gtk2::Table->new($rows, 2, 0); + $vbox->pack_start($table, 0, 0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label( + _("Revocation List Settings"), 'center', 0, 0); + $box->{'nb'}->append_page($vbox, $label); + + foreach $key (@options) { + $entry = GUI::HELPERS::entry_to_table("$key:", + \$main->{'TCONFIG'}->{'server_ca'}->{$key}, + $table, $rows-1, 1, $box); + + $rows++; + $table->resize($rows, 2); + } + + $box->show_all(); + + $box->{'button_ok'}->set_sensitive(0); + $box->{'button_apply'}->set_sensitive(0); + + return; +} + +# +# configuration for CA +# +sub show_config_ca { + my ($main, $opts, $mode) = @_; + + my(@options, $key, $box, $button_ok, $button_cancel, $table, $label, + $entry, $rows, @combostrings, $combonsCertType, $combosubjectAltName, + $combokeyUsage); + + @options = qw( + authorityKeyIdentifier + basicConstraints + issuerAltName + nsComment + nsCaRevocationUrl + nsCaPolicyUrl + nsRevocationUrl + nsPolicyUrl + ); + + if(not defined($opts->{'name'})) { + GUI::HELPERS::print_warning(_("Can't get CA name")); + return; + } + + $main->{'TCONFIG'}->init_config($main, $opts->{'name'}); + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + $button_ok->can_default(1); + + $button_ok->signal_connect('clicked', + sub { + $main->{'TCONFIG'}->write_config($main, $opts->{'name'}); + $opts->{'configured'} = 1; + $main->{'CA'}->create_ca($main, $opts, $box, $mode) }); + + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect('clicked', sub { $box->destroy() }); + + $box = GUI::HELPERS::dialog_box( + _("CA Configuration"), _("CA Configuration"), + $button_ok, $button_cancel); + + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $box->vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label( + _("These Settings are passed to OpenSSL for creating this CA Certificate"), + 'center', 0, 1); + $box->vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label( + _("and the CA Certificates of every SubCA, created with this CA."), + 'center', 0, 1); + $box->vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label( + _("Multiple Values can be separated by \",\""), + 'center', 0, 0); + $box->vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label(' ', 'center', 0, 0); + $box->vbox->pack_start($label, 0, 0, 0); + + $label = GUI::HELPERS::create_label( + _("If you are unsure: leave the defaults untouched"), + 'center', 0, 0); + $box->vbox->pack_start($label, 0, 0, 0); + + $rows = 1; + $table = Gtk2::Table->new($rows, 2, 0); + $box->vbox->add($table); + + # special option keyUsage + $label = GUI::HELPERS::create_label( + _("Key Usage (keyUsage):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $main->{'radiobox'} = Gtk2::HBox->new(0, 0); + $main->{'radio1'} = Gtk2::RadioButton->new(undef, + _($main->{'words'}{'critical'})); + if($main->{'TCONFIG'}->{'v3_ca'}->{'keyUsageType'} eq 'critical') { + $main->{'radio1'}->set_active(1) + } + $main->{'radio1'}->signal_connect('toggled' => + sub{ GUI::CALLBACK::toggle_to_var_pref( $main->{'radio1'}, + \$main->{'TCONFIG'}->{'v3_ca'}->{'keyUsageType'}, 'critical')}); + $main->{'radiobox'}->add($main->{'radio1'}); + + $main->{'radio2'} = Gtk2::RadioButton->new($main->{'radio1'}, + _($main->{'words'}{'noncritical'})); + if($main->{'TCONFIG'}->{'v3_ca'}->{'keyUsageType'} eq 'noncritical') { + $main->{'radio2'}->set_active(1) + } + $main->{'radio2'}->signal_connect('toggled' => + sub {GUI::CALLBACK::toggle_to_var_pref($main->{'radio2'}, + \$main->{'TCONFIG'}->{'v3_ca'}->{'keyUsageType'}, 'noncritical')}); + $main->{'radiobox'}->add($main->{'radio2'}); + + $combokeyUsage = Gtk2::Combo->new(); + @combostrings = ($main->{'words'}{'none'}, + $main->{'words'}{'keyCertSign'}, + $main->{'words'}{'cRLSign'}, + $main->{'words'}{'keyCertSign, cRLSign'}); + $combokeyUsage->set_popdown_strings(@combostrings); + $combokeyUsage->set_use_arrows(1); + $combokeyUsage->set_value_in_list(1, 0); + + if(defined($main->{'TCONFIG'}->{'v3_ca'}->{'keyUsage'})) { + if($main->{'TCONFIG'}->{'v3_ca'}->{'keyUsage'} + ne 'none') { + $main->{'radio1'}->set_sensitive(1); + $main->{'radio2'}->set_sensitive(1); + + if($main->{'TCONFIG'}->{'v3_ca'}->{'keyUsage'} eq 'keyCertSign') { + $combokeyUsage->entry->set_text($main->{'words'}{'keyCertSign'}); + }elsif($main->{'TCONFIG'}->{'v3_ca'}->{'keyUsage'} eq 'cRLSign') { + $combokeyUsage->entry->set_text($main->{'words'}{'cRLSign'}); + }elsif($main->{'TCONFIG'}->{'v3_ca'}->{'keyUsage'} eq + 'keyCertSign, cRLSign') { + $combokeyUsage->entry->set_text($main->{'words'}{'keyCertSign, cRLSign'}); + }else { + $combokeyUsage->entry->set_text($main->{'words'}{'none'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + } + }else { + $combokeyUsage->entry->set_text($main->{'words'}{'none'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + } + } else { + $combokeyUsage->entry->set_text($main->{'words'}{'none'}); + $main->{'radio1'}->set_sensitive(0); + $main->{'radio2'}->set_sensitive(0); + } + $combokeyUsage->entry->signal_connect('changed' => + sub{&GUI::CALLBACK::entry_to_var_key($combokeyUsage, + $combokeyUsage->entry, \$main->{'TCONFIG'}->{'v3_ca'}->{'keyUsage'}, + undef, $main->{words}, $main->{'radio1'}, $main->{'radio2'})}); + $table->attach_defaults($combokeyUsage, 1, 2, $rows-1, $rows); + $rows++; + + $table->attach_defaults($main->{'radiobox'}, 1, 2, $rows-1, $rows); + $rows++; + + # special option nsCerttype + $label = GUI::HELPERS::create_label( + _("Netscape Certificate Type (nsCertType):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $combonsCertType = Gtk2::Combo->new(); + @combostrings = ($main->{'words'}{'none'}, + $main->{'words'}{'emailCA'}, + $main->{'words'}{'sslCA'}, + $main->{'words'}{'objCA'}, + $main->{'words'}{'sslCA, emailCA'}, + $main->{'words'}{'sslCA, objCA'}, + $main->{'words'}{'emailCA, objCA'}, + $main->{'words'}{'sslCA, emailCA, objCA'} + ); + $combonsCertType->set_popdown_strings(@combostrings); + $combonsCertType->set_use_arrows(1); + $combonsCertType->set_value_in_list(1, 0); + if(defined($main->{'TCONFIG'}->{'v3_ca'}->{'nsCertType'})) { + $combonsCertType->entry->set_text( + $main->{'words'}{$main->{'TCONFIG'}->{'v3_ca'}->{'nsCertType'}}); + } else { + $combonsCertType->entry->set_text($main->{'words'}{'none'}); + } + $combonsCertType->entry->signal_connect('changed' => + sub{GUI::CALLBACK::entry_to_var($combonsCertType, + $combonsCertType->entry, \$main->{'TCONFIG'}->{'v3_ca'}->{'nsCertType'}, + undef, $main->{words})}); + $table->attach_defaults($combonsCertType, 1, 2, $rows-1, $rows); + $rows++; + + # special option subjectAltName + $label = GUI::HELPERS::create_label( + _("Subject alternative name (subjectAltName):"), 'left', 0, 0); + $table->attach_defaults($label, 0, 1, $rows-1, $rows); + + $combosubjectAltName = Gtk2::Combo->new(); + @combostrings = ($main->{'words'}{'none'}, $main->{'words'}{'emailcopy'}); + $combosubjectAltName->set_popdown_strings(@combostrings); + $combosubjectAltName->set_use_arrows(1); + $combosubjectAltName->set_value_in_list(1, 0); + + if(defined($main->{'TCONFIG'}->{'v3_ca'}->{'subjectAltName'})) { + if($main->{'TCONFIG'}->{'v3_ca'}->{'subjectAltName'} + eq 'emailcopy') { + $combosubjectAltName->entry->set_text($main->{'words'}{'emailcopy'}); + }elsif($main->{'TCONFIG'}->{'v3_ca'}->{'subjectAltName'} + eq 'none') { + $combosubjectAltName->entry->set_text($main->{'words'}{'none'}); + } + } else { + $combosubjectAltName->entry->set_text($main->{'words'}{'none'}); + } + $combosubjectAltName->entry->signal_connect('changed' => + sub{GUI::CALLBACK::entry_to_var_san($combosubjectAltName, + $combosubjectAltName->entry, \$main->{'TCONFIG'}->{'v3_ca'}->{'subjectAltName'}, + undef, $main->{words})}); + $table->attach_defaults($combosubjectAltName, 1, 2, $rows-1, $rows); + $rows++; + + foreach $key (@options) { + $entry = GUI::HELPERS::entry_to_table("$key:", + \$main->{'TCONFIG'}->{'v3_ca'}->{$key}, $table, $rows-1, 1); + + $rows++; + $table->resize($rows, 2); + } + + $box->show_all(); + + return; +} + +1 diff --git a/lib/GUI/WORDS.pm b/lib/GUI/WORDS.pm new file mode 100644 index 0000000..efd64d6 --- /dev/null +++ b/lib/GUI/WORDS.pm @@ -0,0 +1,112 @@ +# Copyright (c) Stephan Martin +# +# $Id: WORDS.pm,v 1.2 2006/06/28 21:50:42 sm Exp $ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + +use strict; +package GUI::WORDS; + +sub new { + my $that = shift; + + my $self = { + 'none' => _("Not set"), + 'user' => _("Ask User"), + 'critical' => _("critical"), + 'noncritical' => _("not critical"), + 'emailcopy' => _("Copy Email"), + 'raw' => _("raw"), + 'dns' => _("DNS Name"), + 'ip' => _("IP Address"), + 'mail' => _("Email"), + 'server' => _("SSL Server"), + 'server, client' => _("SSL Server, SSL Client"), + 'key' => _("Key Encipherment"), + 'sig' => _("Digital Signature"), + 'keysig' => _("Key Encipherment, Digital Signature"), + 'objsign' => _("Object Signing"), + 'client, objsign' => _("SSL Client, Object Signing"), + 'client, email' => _("SSL Client, Email(S/MIME)"), + 'client' => _("SSL Client"), + 'email' => _("Email(S/MIME)"), + 'client, email, objsign'=> _("SSL Client, Email, Object Signing"), + 'objCA' => _("Object Signing CA"), + 'emailCA' => _("S/MIME CA"), + 'sslCA' => _("SSL CA"), + 'sslCA, emailCA' => _("SSL CA, S/MIME CA"), + 'sslCA, objCA' => _("SSL CA, Object Signing CA"), + 'emailCA, objCA' => _("S/MIME CA, Object Signing CA"), + 'sslCA, emailCA, objCA' => _("SSL CA, S/MIME CA, Object Signing CA"), + 'keyCertSign' => _("Certificate Signing"), + 'cRLSign' => _("CRL Signing"), + 'keyCertSign, cRLSign' => _("Certificate Signing, CRL Signing"), + 'CN' => _("Common Name"), + 'EMAIL' => _("eMail Address"), + 'O' => _("Organization"), + 'OU' => _("Organizational Unit"), + 'L' => _("Location"), + 'ST' => _("State"), + 'C' => _("Country"), + 'NOTBEFORE' => _("Creation Date"), + 'NOTAFTER' => _("Expiration Date"), + 'KEYSIZE' => _("Keylength"), + 'PK_ALGORITHM' => _("Public Key Algorithm"), + 'SIG_ALGORITHM' => _("Signature Algorithm"), + 'TYPE' => _("Type"), + 'SERIAL' => _("Serial"), + 'STATUS' => _("Status"), + 'FINGERPRINTMD5' => _("Fingerprint (MD5)"), + 'FINGERPRINTSHA1' => _("Fingerprint (SHA1)"), + _("Not set") => 'none', + _("Ask User") => 'user', + _("critical") => 'critical', + _("not critical") => 'noncritical', + _("Copy Email") => 'emailcopy', + _("raw") => 'raw', + _("DNS Name") => 'dns', + _("Email") => 'email', + _("IP Address") => 'ip', + _("SSL Server") => 'server', + _("SSL Server, SSL Client") => 'server, client', + _("Key Encipherment") => 'key', + _("Digital Signature") => 'sig', + _("Key Encipherment, Digital Signature") => 'keysig', + _("Object Signing") => 'objsign', + _("Email(S/MIME)") => 'email', + _("SSL Client, Email(S/MIME)") => 'client, email', + _("SSL Client") => 'client', + _("SSL Client, Object Signing") => 'client, objsign', + _("SSL Client, Email, Object Signing") => 'client, email, objsign', + _("Object Signing CA") => 'objCA', + _("S/MIME CA") => 'emailCA', + _("SSL CA") => 'sslCA', + _("SSL CA, S/MIME CA") => 'sslCA, emailCA', + _("SSL CA, Object Signing CA") => 'sslCA, objCA', + _("S/MIME CA, Object Signing CA") => 'emailCA, objCA', + _("SSL CA, S/MIME CA, Object Signing CA")=> 'sslCA, emailCA, objCA', + _("Certificate Signing") => 'keyCertSign', + _("CRL Signing") => 'cRLSign', + _("Certificate Signing, CRL Signing") => 'keyCertSign, cRLSign' + }; + + my $class = ref($that) || $that; + + bless($self, $class); + + $self; +} + +1 diff --git a/lib/GUI/X509_browser.pm b/lib/GUI/X509_browser.pm new file mode 100644 index 0000000..4fb6cec --- /dev/null +++ b/lib/GUI/X509_browser.pm @@ -0,0 +1,879 @@ +# Copyright (c) Olaf Gellert and +# Stephan Martin +# +# $Id: X509_browser.pm,v 1.6 2006/06/28 21:50:42 sm Exp $ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + +use strict; +package GUI::X509_browser; + +use HELPERS; +use GUI::HELPERS; +use GUI::X509_infobox; + +use POSIX; + +my $tmpdefault="/tmp"; + +my $version = "0.1"; +my $true = 1; +my $false = undef; + +sub new { + my $that = shift; + my $self = {}; + + $self->{'main'} = shift; + my $mode = shift; + + my ($font, $fontfix); + + my $class = ref($that) || $that; + + + if ((defined $mode) && + (($mode eq 'cert') || ($mode eq 'req') || ($mode eq 'key'))) { + $self->{'mode'} = $mode; + } else { + printf STDERR "No mode specified for X509browser\n"; + return undef; + } + + # initialize fonts and styles + $font = Gtk2::Pango::FontDescription->from_string( + "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*"); + if(defined($font)) { + $self->{'stylebold'} = Gtk2::Style->new(); + $self->{'stylebold'}->font_desc->from_string( + "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*"); + } else { + $self->{'stylebold'} = undef; + } + + $fontfix = Gtk2::Pango::FontDescription->from_string( + "-adobe-courier-medium-r-normal--*-100-*-*-*-*-*-*"); + if(defined($fontfix)) { + $self->{'stylefix'} = Gtk2::Style->new(); + $self->{'stylefix'}->font_desc->from_string( + "-adobe-courier-medium-r-normal--*-100-*-*-*-*-*-*"); + } else { + $self->{'stylefix'} = undef; + } + + bless($self, $class); + + $self; +} + + +# sub create_window { +# my ($self, $title, $ok_text, $cancel_text, +# $ok_function, $cancel_function) = @_; +# +# my ($button_ok, $button_cancel); +# +# if ( $self->{'dialog_shown'} == $true ) { +# return(undef); +# } +# +# # check arguments +# if ($title eq undef) { +# $title = "CA browser, V$version"; +# } +# +# if (not defined($ok_text)) { +# $ok_text = _("OK"); +# } +# if (not defined($cancel_text)) { +# $cancel_text = _("Cancel"); +# } +# +# # initialize main window +# $self->{'window'} = new Gtk::Dialog(); +# +# # $self->{'window'}->set_policy($false,$false,$true); +# +# # store pointer to vbox as "browser widget" +# $self->{'browser'}=$self->{'window'}->vbox; +# +# if (defined $ok_function) { +# # todo: we should check if this is a function reference +# $self->{'User_OK_function'} = $ok_function; +# } +# $self->{'OK_function'} = sub { $self->ok_function(); }; +# +# if (defined $cancel_function) { +# # todo: we should check if this is a function reference +# $self->{'User_CANCEL_function'} = $cancel_function; +# } +# $self->{'CANCEL_function'} = sub { $self->cancel_function(); }; +# +# +# +# $button_ok = new Gtk::Button( "$ok_text" ); +# $button_ok->signal_connect( "clicked", $self->{'OK_function'}); +# $self->{'window'}->action_area->pack_start( $button_ok, $true, $true, 0 ); +# +# $button_cancel = new Gtk::Button( "$cancel_text" ); +# $button_cancel->signal_connect('clicked', $self->{'CANCEL_function'}); +# $self->{'window'}->action_area->pack_start( $button_cancel, $true, $true, 0 ); +# +# $self->{'window'}->set_title( "$title" ); +# +# $self->{'window'}->show_all(); +# +# } + +sub set_window { + my $self = shift; + my $widget = shift; + + if ( (not defined $self->{'browser'}) || ( $self->{'browser'} == undef )) { + $self->{'browser'}=$widget; + } else { + # browser widget already exists + return $false; + } +} + +sub add_list { + my ($self, $actca, $directory, $crlfile, $indexfile) = @_; + + my ($x509listwin, @titles, @certtitles, @reqtitles, @keytitles, $column, + $color, $text, $iter, $renderer); + + # printf STDERR "AddList: Self: $self, Dir $directory, CRL $crlfile, Index: $indexfile\n"; + + @reqtitles = (_("Common Name"), + _("eMail Address"), + _("Organizational Unit"), + _("Organization"), + _("Location"), + _("State"), + _("Country")); + + @certtitles = (_("Common Name"), + _("eMail Address"), + _("Organizational Unit"), + _("Organization"), + _("Location"), + _("State"), + _("Country"), + _("Status")); + + @keytitles = (_("Common Name"), + _("eMail Address"), + _("Organizational Unit"), + _("Organization"), + _("Location"), + _("State"), + _("Country"), + _("Type")); + + $self->{'actca'} = $actca; + $self->{'actdir'} = $directory; + $self->{'actcrl'} = $crlfile; + $self->{'actindex'} = $indexfile; + + if(defined($self->{'x509box'})) { + $self->{'browser'}->remove($self->{'x509box'}); + $self->{'x509box'}->destroy(); + } + + $self->{'x509box'} = Gtk2::VBox->new(0, 0); + + # pane for list (top) and cert infos (bottom) + $self->{'x509pane'} = Gtk2::VPaned->new(); + $self->{'x509pane'}->set_position(250); + $self->{'x509box'}->add($self->{'x509pane'}); + + $self->{'browser'}->pack_start($self->{'x509box'}, 1, 1, 0); + + # now the list + $x509listwin = Gtk2::ScrolledWindow->new(undef, undef); + $x509listwin->set_policy('automatic', 'automatic'); + $x509listwin->set_shadow_type('etched-in'); + $self->{'x509pane'}->pack1($x509listwin, 1, 1); + + # shall we display certificates, requests or keys? + if ((defined $self->{'mode'}) && ($self->{'mode'} eq "cert")) { + + $self->{'x509store'} = Gtk2::ListStore->new( + 'Glib::String', + 'Glib::String', + 'Glib::String', + 'Glib::String', + 'Glib::String', + 'Glib::String', + 'Glib::String', + 'Glib::String', + 'Glib::Int'); + + @titles = @certtitles; + + } elsif ((defined $self->{'mode'}) && ($self->{'mode'} eq "req")) { + + $self->{'x509store'} = Gtk2::ListStore->new( + 'Glib::String', + 'Glib::String', + 'Glib::String', + 'Glib::String', + 'Glib::String', + 'Glib::String', + 'Glib::String', + 'Glib::Int'); + + @titles = @reqtitles; + + } elsif ((defined $self->{'mode'}) && ($self->{'mode'} eq "key")) { + + $self->{'x509store'} = Gtk2::ListStore->new( + 'Glib::String', + 'Glib::String', + 'Glib::String', + 'Glib::String', + 'Glib::String', + 'Glib::String', + 'Glib::String', + 'Glib::String', + 'Glib::Int'); + + @titles = @keytitles; + + } else { + # undefined mode + return undef; + } + + $self->{'x509store'}->set_sort_column_id(0, 'ascending'); + + $self->{'x509clist'} = Gtk2::TreeView->new_with_model($self->{'x509store'}); + $self->{'x509clist'}->get_selection->set_mode ('single'); + + for(my $i = 0; $titles[$i]; $i++) { + $renderer = Gtk2::CellRendererText->new(); + $column = Gtk2::TreeViewColumn->new_with_attributes( + $titles[$i], $renderer, 'text' => $i); + $column->set_sort_column_id($i); + $column->set_resizable(1); + if (($i == 7) && ($self->{'mode'} eq 'cert')) { + $column->set_cell_data_func ($renderer, sub { + my ($column, $cell, $model, $iter) = @_; + $text = $model->get($iter, 7); + $color = $text eq _("VALID")?'green':'red'; + $cell->set (text => $text, foreground => $color); + }); + } + $self->{'x509clist'}->append_column($column); + } + + if ((defined $self->{'mode'}) && ($self->{'mode'} eq 'cert')) { + $self->{'x509clist'}->get_selection->signal_connect('changed' => + sub { _fill_info($self, 'cert') }); + } elsif ((defined $self->{'mode'}) && ($self->{'mode'} eq 'req')) { + $self->{'x509clist'}->get_selection->signal_connect('changed' => + sub { _fill_info($self, 'req') }); + } + + $x509listwin->add($self->{'x509clist'}); + + update($self, $directory, $crlfile, $indexfile, $true); + +} + +sub update { + my ($self, $directory, $crlfile, $indexfile, $force) = @_; + + $self->{'actdir'} = $directory; + $self->{'actcrl'} = $crlfile; + $self->{'actindex'} = $indexfile; + + # print STDERR "DEBUG: set new dir: $self->{'actdir'}\n"; + + if ($self->{'mode'} eq "cert") { + update_cert($self, $directory, $crlfile, $indexfile, $force); + } elsif ($self->{'mode'} eq "req") { + update_req($self, $directory, $crlfile, $indexfile, $force); + } elsif ($self->{'mode'} eq "key") { + update_key($self, $directory, $crlfile, $indexfile, $force); + } else { + return undef; + } + + if ((defined $self->{'infowin'}) && ($self->{'infowin'} ne "")) { + update_info($self); + } + + $self->{'browser'}->show_all(); + + return($true); +} + +sub update_req { + my ($self, $directory, $crlfile, $indexfile, $force) = @_; + + my ($ind, $name, $state, @line, $iter); + + $self->{'main'}->{'REQ'}->read_reqlist( + $directory, $crlfile, $indexfile, $force, $self->{'main'}); + + $self->{'x509store'}->clear(); + + $ind = 0; + foreach my $n (@{$self->{'main'}->{'REQ'}->{'reqlist'}}) { + ($name, $state) = split(/\%/, $n); + @line = split(/\:/, $name); + $iter = $self->{'x509store'}->append(); + $self->{'x509store'}->set($iter, + 0 => $line[0], + 1 => $line[1], + 2 => $line[2], + 3 => $line[3], + 4 => $line[4], + 5 => $line[5], + 6 => $line[6], + 7 => $ind); + $ind++; + } + # now select the first row to display certificate informations + $self->{'x509clist'}->get_selection->select_path( + Gtk2::TreePath->new_first()); + +} + +sub update_cert { + my ($self, $directory, $crlfile, $indexfile, $force) = @_; + + my ($ind, $name, $state, @line, $iter); + + $self->{'main'}->{'CERT'}->read_certlist( + $directory, $crlfile, $indexfile, $force, $self->{'main'}); + + $self->{'x509store'}->clear(); + + $ind = 0; + foreach my $n (@{$self->{'main'}->{'CERT'}->{'certlist'}}) { + ($name, $state) = split(/\%/, $n); + @line = split(/\:/, $name); + $iter = $self->{'x509store'}->append(); + $self->{'x509store'}->set($iter, + 0 => $line[0], + 1 => $line[1], + 2 => $line[2], + 3 => $line[3], + 4 => $line[4], + 5 => $line[5], + 6 => $line[6], + 7 => $state, + 8 => $ind); + + +# $self->{'x509clist'}->set_text($row, 7, $state); +# if($state eq _("VALID")) { +# $self->{'x509clist'}->set_cell_style($row, 7, $self->{'stylegreen'}); +# } else { +# $self->{'x509clist'}->set_cell_style($row, 7, $self->{'stylered'}); +# } +# $self->{'x509clist'}->set_text($row, 8, $ind); + $ind++; + } + # now select the first row to display certificate informations + $self->{'x509clist'}->get_selection->select_path( + Gtk2::TreePath->new_first()); +} + +sub update_key { + my ($self, $directory, $crlfile, $indexfile, $force) = @_; + + my ($ind, $name, @line, $iter, $state); + + $self->{'main'}->{'KEY'}->read_keylist($self->{'main'}); + + $self->{'x509store'}->clear(); + + $ind = 0; + foreach my $n (@{$self->{'main'}->{'KEY'}->{'keylist'}}) { + ($name, $state) = split(/\%/, $n); + @line = split(/\:/, $name); + $iter = $self->{'x509store'}->append(); + $self->{'x509store'}->set($iter, + 0 => $line[0], + 1 => $line[1], + 2 => $line[2], + 3 => $line[3], + 4 => $line[4], + 5 => $line[5], + 6 => $line[6], + 7 => $state, + 8 => $ind); + + +# $self->{'x509clist'}->set_text($row, 7, $state); +# if($state eq _("VALID")) { +# $self->{'x509clist'}->set_cell_style($row, 7, $self->{'stylegreen'}); +# } else { +# $self->{'x509clist'}->set_cell_style($row, 7, $self->{'stylered'}); +# } +# $self->{'x509clist'}->set_text($row, 8, $ind); + $ind++; + } +} + +sub update_info { + my ($self)=@_; + + my ($title, $parsed, $dn); + + $dn = selection_dn($self); + + if (defined $dn) { + $dn = HELPERS::enc_base64($dn); + + if ($self->{'mode'} eq 'cert') { + $parsed = $self->{'main'}->{'CERT'}->parse_cert($self->{'main'}, + $dn, $false); + $title = _("Certificate Information"); + } else { + $parsed = $self->{'main'}->{'REQ'}->parse_req($self->{'main'}, $dn, + $false); + $title = _("Request Information"); + } + + defined($parsed) || + GUI::HELPERS::print_error(_("Can't read file")); + + if(not defined($self->{'infobox'})) { + $self->{'infobox'} = Gtk2::VBox->new(); + } + + # printf STDERR "DEBUG: Infowin: $self->{'infowin'}, infobox: $self->{'infobox'}\n"; + $self->{'infowin'}->display($self->{'infobox'}, $parsed, + $self->{'mode'}, $title); + + } else { + # nothing selected + $self->{'infowin'}->hide(); + } +} + +# +# add infobox to the browser window +# +sub add_info { + my $self = shift; + + my ($row, $index, $parsed, $title, $status, $list, $dn); + + if ((defined $self->{'infowin'}) && ($self->{'infowin'} ne "")) { + $self->{'infowin'}->hide(); + } else { + $self->{'infowin'} = GUI::X509_infobox->new(); + } + + # printf STDERR "Infowin: $self->{'infowin'}\n"; + # printf STDERR "x509clist: $self->{'x509clist'}\n"; + + $row = $self->{'x509clist'}->get_selection->get_selected(); + + if(defined($row)) { + if ($self->{'mode'} eq 'cert') { + $index = ($self->{'x509store'}->get($row))[8]; + $list = $self->{'main'}->{'CERT'}->{'certlist'}; + } else { + $index = ($self->{'x509store'}->get($row))[7]; + $list = $self->{'main'}->{'REQ'}->{'reqlist'}; + } + } + + if (defined $index) { + ($dn, $status) = split(/\%/, $list->[$index]); + $dn = HELPERS::enc_base64($dn); + + if ($self->{'mode'} eq 'cert') { + $parsed = $self->{'main'}->{'CERT'}->parse_cert($self->{'main'}, $dn, + $false); + $title="Certificate Information"; + } else { + $parsed = $self->{'main'}->{'REQ'}->parse_req($self->{'main'}, $dn, + $false); + $title="Request Information"; + } + + defined($parsed) || GUI::HELPERS::print_error(_("Can't read file")); + + # printf STDERR "Infowin: $self->{'infowin'}\n"; + $self->{'infobox'} = Gtk2::VBox->new(); + $self->{'x509pane'}->pack2($self->{'infobox'}, 1, 1); + $self->{'infowin'}->display($self->{'infobox'}, $parsed, $self->{'mode'}, + $title); + } +} + +sub hide { + my ($self) = @_; + + $self->{'window'}->hide(); + $self->{'dialog_shown'} = $false; +} + +sub destroy { + my ($self) = @_; + + $self->{'window'}->destroy(); + $self->{'dialog_shown'} = $false; +} + +# +# signal handler for selected list items +# (updates the X509_infobox window) +# XXX why is that function needed?? +# +sub _fill_info { + my ($self) = @_; + + # print STDERR "DEBUG: fill_info: @_\n"; + update_info($self) if (defined $self->{'infowin'}); +} + +sub selection_fname { + my $self = shift; + + my ($selected, $row, $index, $dn, $status, $filename, $list); + + $row = $self->{'x509clist'}->get_selection->get_selected(); + + return undef if (not defined $row); + + if ($self->{'mode'} eq 'req') { + $index = ($self->{'x509store'}->get($row))[7]; + $list = $self->{'main'}->{'REQ'}->{'reqlist'}; + } elsif ($self->{'mode'} eq 'cert') { + $index = ($self->{'x509store'}->get($row))[8]; + $list = $self->{'main'}->{'CERT'}->{'certlist'}; + } elsif ($self->{'mode'} eq 'key') { + $index = ($self->{'x509store'}->get($row))[8]; + $list = $self->{'main'}->{'KEY'}->{'certlist'}; + } else { + GUI::HELPERS::print_error( + _("Invalid browser mode for selection_fname():"." " + .$self->{'mode'})); + } + + + if (defined $index) { + ($dn, $status) = split(/\%/, $list->[$index]); + $filename= HELPERS::enc_base64($dn); + $filename=$self->{'actdir'}."/$filename".".pem"; + } else { + $filename = undef; + } + + return($filename); +} + +sub selection_dn { + my $self = shift; + + my ($selected, $row, $index, $dn, $status, $list); + + $row = $self->{'x509clist'}->get_selection->get_selected(); + + return undef if (not defined $row); + + if ($self->{'mode'} eq 'req') { + $index = ($self->{'x509store'}->get($row))[7]; + $list = $self->{'main'}->{'REQ'}->{'reqlist'}; + } elsif ($self->{'mode'} eq 'cert') { + $index = ($self->{'x509store'}->get($row))[8]; + $list = $self->{'main'}->{'CERT'}->{'certlist'}; + } elsif ($self->{'mode'} eq 'key') { + $index = ($self->{'x509store'}->get($row))[8]; + $list = $self->{'main'}->{'KEY'}->{'keylist'}; + } else { + GUI::HELPERS::print_error( + _("Invalid browser mode for selection_dn():"." " + .$self->{'mode'})); + } + + if (defined $index) { + ($dn, $status) = split(/\%/, $list->[$index]); + } else { + $dn = undef; + } + + return($dn); +} + +sub selection_cadir { + my $self = shift; + + my $dir; + + $dir = $self->{'actdir'}; + # cut off the last directory name to provide the ca-directory + $dir =~ s/\/certs|\/req|\/keys$//; + return($dir); +} + + +sub selection_caname { + my $self = shift; + + my ($selected, $caname); + + $caname = $self->{'actca'}; + return($caname); +} + +sub selection_cn { + my $self = shift; + + my ($selected, $row, $index, $cn); + + $row = $self->{'x509clist'}->get_selection->get_selected(); + + return undef if (not defined $row); + + if (($self->{'mode'} eq 'req') || + ($self->{'mode'} eq 'cert')|| + ($self->{'mode'} eq 'key')) { + $cn = ($self->{'x509store'}->get($row))[0]; + } else { + GUI::HELPERS::print_error( + _("Invalid browser mode for selection_cn():"." " + .$self->{'mode'})); + } + + return($cn); +} + +sub selection_email { + my $self = shift; + + my ($selected, $row, $index, $email); + + $row = $self->{'x509clist'}->get_selection->get_selected(); + return undef if (not defined $row); + + if (($self->{'mode'} eq 'req') || + ($self->{'mode'} eq 'cert') || + ($self->{'mode'} eq 'key')) { + $email = ($self->{'x509store'}->get($row))[1]; + } else { + GUI::HELPERS::print_error( + _("Invalid browser mode for selection_cn():"." " + .$self->{'mode'})); + } + + return($email); +} + +sub selection_status { + my $self = shift; + + my ($selected, $row, $index, $dn, $status, $list); + + $row = $self->{'x509clist'}->get_selection->get_selected(); + + return undef if (not defined $row); + + if ($self->{'mode'} eq 'cert') { + $index = ($self->{'x509store'}->get($row))[8]; + $list = $self->{'main'}->{'CERT'}->{'certlist'}; + } else { + GUI::HELPERS::print_error( + _("Invalid browser mode for selection_status():"." " + .$self->{'mode'})); + } + + if (defined $index) { + ($dn, $status) = split(/\%/, $list->[$index]); + } else { + $status = undef; + } + + return($status); +} + +sub selection_type { + my $self = shift; + + my ($selected, $row, $index, $dn, $type, $list); + + $row = $self->{'x509clist'}->get_selection->get_selected(); + + return undef if (not defined $row); + + if ($self->{'mode'} eq 'key') { + $index = ($self->{'x509store'}->get($row))[8]; + $list = $self->{'main'}->{'KEY'}->{'keylist'}; + } else { + GUI::HELPERS::print_error( + _("Invalid browser mode for selection_type():"." " + .$self->{'mode'})); + } + + if (defined $index) { + ($dn, $type) = split(/\%/, $list->[$index]); + } else { + $type = undef; + } + + return($type); +} + + +sub ok_function { + my ($self) = @_; + + # is there a user defined ok_function? + if (defined $self->{'User_OK_function'}) { + $self->{'User_OK_function'}($self, selection_fname($self)); + } + # otherwise do default + else { + printf STDOUT "%s\n", selection_fname($self); + $self->hide(); + } + return $true; + +} + +sub cancel_function { + my ($self) = @_; + + # is there a user defined ok_function? + if (defined $self->{'User_CANCEL_function'}) { + $self->{'User_CANCEL_function'}($self, get_listselect($self)); + } + # otherwise do default + else { + $self->{'window'}->hide(); + $self->{'dialog_shown'} = $false; + } + return $true; +} + + + +# +# sort the table by the clicked column +# +sub _sort_clist { + my ($clist, $col) = @_; + + $clist->set_sort_column($col); + $clist->sort(); + + return(1); +} + + +# +# called on mouseclick in certlist +# +sub _show_cert_menu { + my ($clist, $self, $event) = @_; + + if ((defined($event->{'type'})) && + $event->{'button'} == 3) { + $self->{'certmenu'}->popup( + undef, + undef, + 0, + $event->{'button'}, + undef); + + return(1); + } + + return(0); +} + +$true; + +__END__ + +=head1 NAME + +GUI::X509_browser - Perl-Gtk2 browser for X.509 certificates and requests + +=head1 SYNOPSIS + + use X509_browser; + + $browser=X509_browser->new($mode); + $browser->create_window($title, $oktext, $canceltext, + \&okayfunction, \&cancelfunction); + $browser->add_ca_select($cadir, @calist, $active-ca); + $browser->add_list($active-ca, $X509dir, $crlfile, $indexfile); + $browser->add_info(); + my $selection = $browser->selection_fname(); + $browser->hide(); + +=head1 DESCRIPTION + +This displays a browser for X.509v3 certificates or certification +requests (CSR) from a CA managed by TinyCA2 (or some similar +structure). + +Creation of an X509_browser is done by calling B, +the argument has to be 'cert' or 'req' to display certificates +or requests. + +A window can be created for this purpose using +B, +all arguments are optional. + +=over 1 + +=item $title: + +the existing Gtk2::VBox inside which the info will be +displayed. + +=item $oktext: + +The text to be displayed on the OK button of the dialog. + +=item $canceltext: + +The text to be displayed on the CANCEL button of the dialog. + +=item \&okfunction: + +Reference to a function that is executed on click on OK button. +This function should fetch the selected result (using +B) and also close the dialog using B. + +=item \&cancelfunction: + +Reference to a function that is executed on click on CANCEL button. +This function should also close the dialog using B. + +=back + +Further functions to get information about the selected item +exist, these are selection_dn(), selection_status(), +selection_cadir() and selection_caname(). + +An existing infobox that already displays the content +of some directory can be modified by calling +update() with the same arguments that add_list(). + +An existing infobox is destroyed by calling B. + +=cut diff --git a/lib/GUI/X509_infobox.pm b/lib/GUI/X509_infobox.pm new file mode 100644 index 0000000..97f6280 --- /dev/null +++ b/lib/GUI/X509_infobox.pm @@ -0,0 +1,280 @@ +# Copyright (c) Olaf Gellert and +# Stephan Martin +# +# $Id: X509_infobox.pm,v 1.7 2006/06/28 21:50:42 sm Exp $ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + +use strict; +package GUI::X509_infobox; + +use HELPERS; +use GUI::HELPERS; +use GUI::WORDS; + +use POSIX; + +my $version = "0.1"; +my $true = 1; +my $false = undef; + +sub new { + my $that = shift; + my $self = {}; + + my $class = ref($that) || $that; + + $self->{'init'} = shift; + + bless($self, $class); + + $self; +} + + +sub display { + my ($self, $parent, $parsed, $mode, $title) = @_; + + my ($bottombox, $textbox, $lefttable, $righttable, $leftbox, $rightbox, + @fields, $scrolled); + + $self->{'root'} = $parent; + + if (defined $self->{'child'}) { + $self->{'child'}->destroy(); + } + + # if title is given create a surrounding frame with the title + if (defined $title) { + $self->{'child'}= Gtk2::Frame->new($title); + $self->{'x509textbox'}= Gtk2::VBox->new(0,0); + $self->{'child'}->add($self->{'x509textbox'}); + } + # otherwise we create the VBox directly inside the root widget + else { + $self->{'child'} = Gtk2::VBox->new(0,0); + $self->{'x509textbox'} = $self->{'child'}; + } + + # and pack it there + $self->{'root'}->pack_start($self->{'child'}, 1, 1, 0); + + if (($mode eq 'cert') || ($mode eq 'cacert')) { + # fingerprint in the top of certtextbox + if(defined($self->{'certfingerprintmd5'})) { + $self->{'certfingerprintmd5'}->destroy(); + } + $self->{'certfingerprintmd5'} = GUI::HELPERS::create_label( + _("Fingerprint (MD5)").": ".$parsed->{'FINGERPRINTMD5'}, + 'center', 0, 0); + $self->{'x509textbox'}->pack_start( $self->{'certfingerprintmd5'}, + 0, 0, 0); + + if(defined($self->{'certfingerprintsha1'})) { + $self->{'certfingerprintsha1'}->destroy(); + } + $self->{'certfingerprintsha1'} = GUI::HELPERS::create_label( + _("Fingerprint (SHA1)").": ".$parsed->{'FINGERPRINTSHA1'}, + 'center', 0, 0); + $self->{'x509textbox'}->pack_start($self->{'certfingerprintsha1'}, + 0, 0, 0); + } + + if (($mode eq 'cert') || ($mode eq 'cacert')) { + $bottombox = 'certbottombox'; + $textbox = 'x509textbox'; + $lefttable = 'certlefttable'; + $leftbox = 'certleftbox'; + $righttable = 'certrighttable'; + $rightbox = 'certrightbox'; + }else{ + $bottombox = 'reqbottombox'; + $textbox = 'x509textbox'; + $lefttable = 'reqlefttable'; + $leftbox = 'reqleftbox'; + $righttable = 'reqrighttable'; + $rightbox = 'reqrightbox'; + } + + # hbox in the bottom + if(defined($self->{$bottombox})) { + $self->{$bottombox}->destroy(); + } + $self->{$bottombox} = Gtk2::HBox->new(1, 0); + $self->{$textbox}->pack_start($self->{$bottombox}, 1, 1, 5); + + # vbox in the bottom/left + if(defined($self->{$lefttable})) { + $self->{$lefttable}->destroy(); + } + @fields = qw( CN EMAIL O OU L ST C); + $self->{$lefttable} = _create_detail_table(\@fields, $parsed); + + # the only widget i know to set shadow type :-( + $scrolled = Gtk2::ScrolledWindow->new(); + $scrolled->set_shadow_type('etched-in'); + $scrolled->set_policy('never', 'never'); + + $self->{$leftbox} = Gtk2::VBox->new(0, 0); + $self->{$bottombox}->pack_start($self->{$leftbox}, 1, 1, 0); + + $self->{$leftbox}->pack_start($scrolled, 1, 1, 0); + $scrolled->add($self->{$lefttable}); + + # vbox in the bottom/right + if(defined($self->{$righttable})) { + $self->{$righttable}->destroy(); + } + if ($mode eq "cacert") { + @fields = qw(SERIAL NOTBEFORE NOTAFTER KEYSIZE PK_ALGORITHM SIG_ALGORITHM + TYPE); + } else { + @fields = qw(STATUS SERIAL NOTBEFORE NOTAFTER KEYSIZE PK_ALGORITHM + SIG_ALGORITHM TYPE); + } + + $self->{$righttable} = _create_detail_table(\@fields, $parsed); + + $scrolled = Gtk2::ScrolledWindow->new(); + $scrolled->set_shadow_type('etched-in'); + $scrolled->set_policy('never', 'never'); + + $self->{$rightbox} = Gtk2::VBox->new(0, 0); + $self->{$bottombox}->pack_start($self->{$rightbox}, 1, 1, 0); + + $self->{$rightbox}->pack_start($scrolled, 1, 1, 0); + $scrolled->add($self->{$righttable}); + + $self->{$textbox}->show_all(); + + $parent->show_all(); +} + +sub hide { + my $self = shift; + + if (defined $self->{'child'}) { + $self->{'child'}->destroy(); + undef $self->{'child'}; + } +} + +# +# create standard table with details (cert/req) +# +sub _create_detail_table { + my ($fields, $parsed) = @_; + + my ($list, $store, $rows, $words, @l, $iter, $column, $renderer); + + $words = GUI::WORDS->new(); + + $store = Gtk2::ListStore->new('Glib::String', 'Glib::String'); + $list = Gtk2::TreeView->new_with_model($store); + $list->set_headers_visible(0); + $list->get_selection->set_mode('none'); + + $renderer = Gtk2::CellRendererText->new(); + $column = Gtk2::TreeViewColumn->new_with_attributes( + '', $renderer, 'text' => 0); + $list->append_column($column); + + $renderer = Gtk2::CellRendererText->new(); + $column = Gtk2::TreeViewColumn->new_with_attributes( + '', $renderer, 'text' => 1); + $list->append_column($column); + + + foreach my $f (@{$fields}) { + if(defined($parsed->{$f})){ + if(ref($parsed->{$f})) { + foreach(@{$parsed->{$f}}) { + $iter = $store->append(); + $store->set($iter, 0 => $words->{$f}, 1 => $_); + # print STDERR "DEBUG: add line: @l\n"; + + } + }else{ + # print STDERR "DEBUG: add line: @l\n"; + $iter = $store->append(); + $store->set($iter, 0 => $words->{$f}, 1 => $parsed->{$f}); + } + } + } + + return($list); +} + + +1; + + +__END__ + +=head1 NAME + +GUI::X509_infobox - show X.509 certificates and requests in a Gtk2::VBox + +=head1 SYNOPSIS + + use X509_infobox; + + $infobox=X509_infobox->new(); + $infobox->update($parent,$parsed,$mode,$title); + $infobox->update($parent,$parsed,$mode); + $infobox->hide(); + +=head1 DESCRIPTION + +This displays the information of an X.509v3 certificate or +certification request (CSR) inside a given Gtk2::VBox. + +Creation of an X509_infobox is done by calling B, +no arguments are required. + +The infobox is shown when inserted into an already +existing Gtk2::VBox using the method B. Arguments +to update are: + +=over 1 + +=item $parent: + +the existing Gtk2::VBox inside which the info will be +displayed. + +=item $parsed: + +a structure returned by OpenSSL::parsecert() or OpenSSL::parsecrl() +containing the required information. + +=item $mode: + +what type of information is to be displayed. Valid modes +are 'req' (certification request), 'cert' (certificate), 'key' or 'cacert' +(same as certificate but without displaying the validity information +of the cert because this cannot be decided on from the view of the +actual CA). + +=item $title: + +if specified, a surrounding frame with the given title +is drawn. + +=back + +An existing infobox is destroyed by calling B. + +=cut diff --git a/lib/HELPERS.pm b/lib/HELPERS.pm new file mode 100644 index 0000000..91d894a --- /dev/null +++ b/lib/HELPERS.pm @@ -0,0 +1,393 @@ +# Copyright (c) Olaf Gellert and +# Stephan Martin +# +# $Id: HELPERS.pm,v 1.6 2006/06/28 21:50:41 sm Exp $ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + +use strict; +package HELPERS; + +use POSIX; + +my $version = "0.1"; +my $true = 1; +my $false = undef; + +# +# generate filename from Subject-DN +# +sub gen_name { + my $opts = shift; + + my $name = ''; + + foreach (qw(CN EMAIL OU O L ST C)) { + if((not defined($opts->{$_})) || ($opts->{$_} eq '')) { + $opts->{$_} = "."; + } + if($opts->{$_} ne '.' && not ref($opts->{$_})) { + $name .= $opts->{$_}; + } elsif (ref($opts->{$_})) { + if(defined($opts->{$_}->[0])) { + $name .= $opts->{$_}->[0]; + } else { + $name .= " "; + } + } else { + $name .= " "; + } + $name .= ":" if($_ ne 'C'); + } + + return($name); +} + +# +# generate temporary filename +# +sub mktmp { + my $base = shift; + + my @rand = (); + my $ret = ''; + + do { + for(my $i = 0; $i < 8; $i++) { + push(@rand, int(rand 26)+65); + } + my $end = pack("C8", @rand); + $ret = $base.$end; + } while (-e $ret); + + return($ret); +} + + +# +# finished... +# +sub exit_clean { + my ($ret) = @_; + + $ret = 0 unless(defined $ret); + + # hack to avoid busy cursor + my $rootwin = Gtk2::Gdk->get_default_root_window(); + my $cursor = Gtk2::Gdk::Cursor->new('left-ptr'); + + $rootwin->set_cursor($cursor); + + Gtk2->main_quit(); + exit($ret); +} + +# +# split Subject DN and return hash +# +sub parse_dn { + my $dn = shift; + + my (@dn, $k, $v, $tmp); + + $tmp = {}; + + $dn =~ s/,/\//g; + + @dn = split(/\//, $dn); + foreach(@dn) { + s/^\s+//; + s/\s+$//; + ($k, $v) = split(/=/); + next if(not defined($k)); + if($k =~ /ou/i) { + $tmp->{'OU'} or $tmp->{'OU'} = []; + push(@{$tmp->{'OU'}}, $v); + } else { + if($k =~ /emailaddress/i) { + $tmp->{'EMAIL'} = $v; + } else { + $tmp->{uc($k)} = $v; + } + } + } + + return($tmp); +} + +# +# parse (requested) X509 extensions and return hash +# +sub parse_extensions { + my ($lines, $mode) = @_; + + my ($sep, $i, $k, $v, $tmp); + + $sep = $mode eq "req"?"Requested extensions:":"X509v3 extensions:"; + + $tmp = {}; + + # skip everything before the extensions + for($i = 0; defined($lines->[$i]) && $lines->[$i] !~ /^[\s\t]*$sep$/i; $i++) { + return(undef) if not defined($lines->[$i]); + } + $i++; + + while($i < @{$lines}) { + if(($lines->[$i] =~ /^[\s\t]*[^:]+:\s*$/) || + ($lines->[$i] =~ /^[\s\t]*[^:]+:\s+.+$/)) { + if($lines->[$i] =~ /^[\s\t]*Signature Algorithm/i) { + $i++; + next; + } + $k = $lines->[$i]; + $k =~ s/[\s\t:]*$//g; + $k =~ s/^[\s\t]*//g; + $tmp->{$k} = []; + $i++; + while(($lines->[$i] !~ /^[\s\t].+:\s*$/) && + ($lines->[$i] !~ /^[\s\t]*[^:]+:\s+.+$/) && + ($lines->[$i] !~ /^[\s\t]*Signature Algorithm/i) && + ($i < @{$lines})) { + $v = $lines->[$i]; + $v =~ s/^[\s]+//g; + $v =~ s/[\s]+$//g; + $i++; + next if $v =~ /^$/; + next if $v =~ /Signature Algorithm:/; + my @vs = split(/,/, $v); + foreach(@vs) { + $_ =~ s/^\s//; + $_ =~ s/\s$//; + push(@{$tmp->{$k}}, $_); + } + } + } else { + $i++; + } + } + + return($tmp); +} + +# +# get last used export directory +# +sub get_export_dir { + my $main = shift; + + open(EXPIN, "<$main->{'cadir'}/.exportdir") || return(undef); + my $dir = ; + chomp($dir); + + return($dir); +} + +# +# write last used export directory +# +sub write_export_dir { + my ($main, $dir) = @_; + + $dir =~ s:/[^/]+$::; + + open(EXPOUT, ">$main->{'cadir'}/.exportdir") || do { + my $t = sprintf(_("Can't write exportdir: %s, %s"), + "$main->{'cadir'}/.exportdir", $!); + GUI::HELPERS::print_warning($t); + return; + }; + print EXPOUT "$dir\n"; + + close(EXPOUT); + + return($dir); +} + +# +# generate contents for subjectAltName +# +sub gen_subjectaltname_contents($@) +{ +my $type = shift || ''; +my @input = map { split/,\s*|\s+/, $_ } @_; # split on ',' and ' ' +my %output = (); # uniq on the fly + + if ($type) { # type given => use that one for all + foreach my $elem (@input) { + $output{$type.$elem} = 1; + } + } + else { # no type => use heuristigcs to guess type per element + foreach my $elem (@input) { + if ($elem =~ s/^(ip:|dns:)(.*)/$2/i) { + $type = uc($1); + } elsif ($elem =~ s/^(email:)(.*)/$2/i) { + $type = lc($1); + } else { + if ($elem =~ /^\d+\.\d+\.\d+\.\d+$/) { # it's an IP address + $type = 'IP:'; + } + elsif ($elem =~ /^.+\@.+\.\w+$/) { # it's a mail address + $type = 'email:'; + } + else { + $type = 'DNS:' # otherwise it's a DNS name + } + } + $output{$type.$elem} = 1; + } + } + return(wantarray ? keys(%output) : join(', ', keys(%output))); +} + +sub enc_base64 { + my $data = shift; + my $ret = MIME::Base64::encode($data, ''); + $ret =~ tr/\/+/-_/; + return $ret; +} + +sub dec_base64 { + my $data = shift; + $data =~ tr/-_/\/+/; + return MIME::Base64::decode($data); +} + + +1 + +__END__ + +=head1 NAME + +HELPERS - helper functions for TinyCA, doing small jobs not related to the GUI + +=head1 SYNOPSIS + + use HELPERS; + + $name = HELPERS::gen_name($opts); + $tmpnam = HELPERS::mktmp($base); + $dnhash = HELPERS::parse_dn($dnstring); + $exthash = HELPERS::parse_extensions($mode, $lines); + $subjaltname = HELPERS::gen_subjectaltname_contents($type, @list); + + exit_clean($retcode); + +=head1 DESCRIPTION + +HELPERS.pm is just a library, containing some useful functions used by other +TinyCA modules. + +=head1 FUNCTIONS + +=head2 HELPERS::gen_name($opts) + +=over 1 + +returns a string with the TinyCA filename for a certificate, request or key. +The filename is generated from the following parts of the Subject DN from the +related request or certificate if present: + + CN EMAIL OU O L ST C + +These parts need to be elements in the given options hash. + +=back + +=head2 HELPERS::mktmp($base) + +=over 1 + +returns a string, containing a uniqe filename starting with $base, which is +not existing yet. + +$base needs to be an absolute path to allow HELPERS::mktmp() reliable check +that the filename is really uniqe. + +=back + +=head2 HELPERS::parse_dn($dnstring) + +=over 1 + +returns the reference to a hash containing all elements of the Subject DN, +given in $dnstring. + +The element OU is included as an array refernce in the hash, with an array +containing all values of OU. + +=back + +=head2 HELPERS::parse_extensions($mode, $lines) + +=over 1 + +returns the reference to a hash containing all X509 extensions of the given +request or certificate. + +The request or certificate is given in textform as an array reference +with the array containing one line per element. + +$mode contains one of the strings "req" or "cert" depending on the type of the +data. + +=back + +=head2 HELPERS::exit_clean($retcode) + +=over 1 + +does nothing yet, than closing the Gtk application returning the exitcode +given in $retcode. + +=back + +=head2 $main->HELPERS::get_export_dir() + +=over 1 + +Get last used export directory. + +=back + +=head2 $main->HELPERS::write_export-dir($dir) + +=over 1 + +Store last used export directory + +=back + +=head2 HELPERS::gen_subjectaltname_contents($type, @list) + +=over 1 + +Generate a string suitable for the use as subjhectAltname contets for OpenSSL. + +If $Type is not empty create the contents of that type only, +otherwise use either the type prefix of the list elements or +the following heuristics to find the type for the appropriate elements: + +If the element looks like an IP address in dotted quad notation set +then treat it as one. +If the element contains a '@' followed by a '.' and a sequence of letters +then treat the element as an email address. +In all other cases treat it as a DNS name. + +=back + +=cut diff --git a/lib/KEY.pm b/lib/KEY.pm new file mode 100644 index 0000000..ad37527 --- /dev/null +++ b/lib/KEY.pm @@ -0,0 +1,494 @@ +# Copyright (c) Stephan Martin +# +# $Id: KEY.pm,v 1.8 2006/06/28 21:50:41 sm Exp $ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + +use strict; + +package KEY; + +use POSIX; + +sub new { + my $self = {}; + my $that = shift; + my $class = ref($that) || $that; + + bless($self, $class); +} + +# +# get name of keyfile to delete +# +sub get_del_key { + my ($self, $main) = @_; + + my($keyname, $key, $keyfile, $row, $ind, $ca, $type); + + $ca = $main->{'keybrowser'}->selection_caname(); + $key = $main->{'keybrowser'}->selection_dn(); + + if(not defined $key) { + GUI::HELPERS::print_info(_("Please select a Key first")); + return; + } + + $keyname = HELPERS::enc_base64($key); + + $keyfile = $main->{'cadir'}."/keys/".$keyname.".pem"; + + if(not -s $keyfile) { + GUI::HELPERS::print_warning(_("Key file not found:".$keyfile)); + return; + } + + $main->show_del_confirm($keyfile, 'key'); + + return; +} + +# +# now really delete the key +# +sub del_key { + my ($self, $main, $file) = @_; + + unlink($file); + + my $cadir = $main->{'keybrowser'}->selection_cadir(); + + $main->{'keybrowser'}->update($cadir."/keys", + $cadir."/crl/crl.pem", + $cadir."/index.txt", + 0); + + return; +} + +# +# read keys in directory into list +# +sub read_keylist { + my ($self, $main) = @_; + + my ($f, $modt, $tmp, $ca, $keydir, $keylist); + + $ca = $main->{'CA'}->{'actca'}; + $keydir = $main->{'cadir'}."/keys"; + $keylist = []; + + $modt = (stat($keydir))[9]; + + if(defined($self->{'lastread'}) && + $self->{'lastread'} >= $modt) { + return(0); + } + + opendir(DIR, $keydir) || do { + GUI::HELPERS::print_warning(_("Can't open key directory")); + return(0); + }; + + while($f = readdir(DIR)) { + next if $f =~ /^\./; + $f =~ s/\.pem//; + $tmp = HELPERS::dec_base64($f); + next if not defined($tmp); + next if $tmp eq ""; + $tmp = _check_key($main, $keydir."/".$f.".pem", $tmp); + push(@{$keylist}, $tmp); + } + @{$keylist} = sort(@{$keylist}); + closedir(DIR); + + $self->{'keylist'} = $keylist; + + $self->{'lastread'} = time(); + return(1); # got new list +} + +# +# get the information to export the key +# +sub get_export_key { + my ($self, $main, $opts, $box) = @_; + + $box->destroy() if(defined($box)); + + my($ca, $ind, $row, $t, $out, $cn, $email, $ret, $ext, $cadir); + + if(not defined($opts)) { + $cn = $main->{'keybrowser'}->selection_cn(); + + if(not defined $cn) { + GUI::HELPERS::print_info(_("Please select a Key first")); + return; + } + + $ca = $main->{'keybrowser'}->selection_caname(); + $cadir = $main->{'keybrowser'}->selection_cadir(); + $email = $main->{'keybrowser'}->selection_email(); + + $opts->{'type'} = $main->{'keybrowser'}->selection_type(); + $opts->{'key'} = $main->{'keybrowser'}->selection_dn(); + + $opts->{'keyname'} = HELPERS::enc_base64($opts->{'key'}); + $opts->{'keyfile'} = $cadir."/keys/".$opts->{'keyname'}.".pem"; + $opts->{'certfile'} = $cadir."/certs/".$opts->{'keyname'}.".pem"; + + # set some defaults + $opts->{'nopass'} = 0; + $opts->{'include'} = 0; + $opts->{'format'} = 'PEM'; + $opts->{'friendlyname'} = ''; + + if((defined($email)) && $email ne '' && $email ne ' ') { + $opts->{'outfile'} = "$main->{'exportdir'}/$email-key.pem"; + }elsif((defined($cn)) && $cn ne '' && $cn ne ' ') { + $opts->{'outfile'} = "$main->{'exportdir'}/$cn-key.pem"; + }else{ + $opts->{'outfile'} = "$main->{'exportdir'}/key.pem"; + } + + $main->show_export_dialog($opts, 'key'); + return; + } + + if((not defined($opts->{'outfile'})) || ($opts->{'outfile'} eq '')) { + $main->show_export_dialog($opts, 'key'); + GUI::HELPERS::print_warning(_("Please give at least the output file")); + return; + } + + if(($opts->{'nopass'} || $opts->{'format'} eq 'DER') && + ((not defined($opts->{'passwd'})) || ($opts->{'passwd'} eq ''))) { + $main->show_key_nopasswd_dialog($opts); + return; + } + + if(($opts->{'format'} eq 'PEM') || ($opts->{'format'} eq 'DER')) { + unless(($opts->{'format'} eq 'PEM') && not $opts->{'nopass'}) { + ($out, $ext) = $main->{'OpenSSL'}->convkey( + 'type' => $opts->{'type'}, + 'inform' => 'PEM', + 'outform' => $opts->{'format'}, + 'nopass' => $opts->{'nopass'}, + 'pass' => $opts->{'passwd'}, + 'keyfile' => $opts->{'keyfile'} + ); + + if(defined($out) && $out eq 1) { + $t = _("Wrong password given\nDecrypting of the Key failed\nExport is not possible"); + GUI::HELPERS::print_warning($t, $ext); + return; + } elsif((not defined($out)) || (length($out) < 3)) { + GUI::HELPERS::print_warning( + _("Converting failed, Export not possible"), $ext); + return; + } + } + + if(($opts->{'format'} eq 'PEM') && not $opts->{'nopass'}) { + open(IN, "<$opts->{'keyfile'}") || do { + $t = sprintf(_("Can't open Key file: %s: %s"), + $opts->{'keyfile'}, $!); + GUI::HELPERS::print_warning($t); + return; + }; + $out .= $_ while(); + close(IN); + } + if($opts->{'include'}) { + open(IN, "<$opts->{'certfile'}") || do { + $t = sprintf(_("Can't open Certificate file: %s: %s"), + $opts->{'certfile'}, $!); + GUI::HELPERS::print_warning($t); + return; + }; + $out .= "\n"; + $out .= $_ while(); + close(IN); + } + + open(OUT, ">$opts->{'outfile'}") || do { + $t = sprintf(_("Can't open output file: %s: %s"), + $opts->{'outfile'}, $!); + GUI::HELPERS::print_warning($t); + return; + }; + + print OUT $out; + close(OUT); + + $main->{'exportdir'} = HELPERS::write_export_dir($main, + $opts->{'outfile'}); + + $t = sprintf(_("Key succesfully exported to %s"), + $opts->{'outfile'}); + GUI::HELPERS::print_info($t); + return; + + } elsif ($opts->{'format'} eq 'P12') { + $opts->{'certfile'} = + $main->{'cadir'}."/certs/".$opts->{'keyname'}.".pem"; + $opts->{'cafile'} = + $main->{'cadir'}."/cacert.pem"; + + if (-f $main->{'cadir'}."/cachain.pem") { + $opts->{'cafile'} = $main->{'cadir'}."/cachain.pem"; + } + + if(not -s $opts->{'certfile'}) { + $t = _("Certificate is necessary for export as PKCS#12"); + $t .= "\n"; + $t .= _("Export is not possible!"); + GUI::HELPERS::print_warning($t); + return; + } + + if((not defined($opts->{'p12passwd'})) && + (not $opts->{'nopass'})) { + $opts->{'includeca'} = 1; + $main->show_p12_export_dialog($opts, 'key'); + return; + } + + unlink($opts->{'outfile'}); + ($ret, $ext) = $main->{'OpenSSL'}->genp12( + type => $opts->{'type'}, + certfile => $opts->{'certfile'}, + keyfile => $opts->{'keyfile'}, + cafile => $opts->{'cafile'}, + outfile => $opts->{'outfile'}, + passwd => $opts->{'passwd'}, + p12passwd => $opts->{'p12passwd'}, + includeca => $opts->{'includeca'}, + nopass => $opts->{'nopass'}, + friendly => $opts->{'friendlyname'} + ); + + if($ret eq 1) { + $t = "Wrong password given\nDecrypting Key failed\nGenerating PKCS#12 failed"; + GUI::HELPERS::print_warning($t, $ext); + return; + } elsif($ret || (not -s $opts->{'outfile'})) { + $t = _("Generating PKCS#12 failed"); + return; + } + + $main->{'exportdir'} = HELPERS::write_export_dir($main, + $opts->{'outfile'}); + + $t = sprintf(_("Certificate and Key successfully exported to %s"), + $opts->{'outfile'}); + GUI::HELPERS::print_info($t, $ext); + return; + + } elsif (($opts->{'format'} eq "ZIP") || ($opts->{'format'} eq "TAR")) { + $opts->{'certfile'} = + $main->{'cadir'}."/certs/".$opts->{'keyname'}.".pem"; + if(not -s $opts->{'certfile'}) { + $t = sprintf( + _("Certificate is necessary for export as %s file"), + $opts->{'format'}); + $t .= "\n"; + $t .= _("Export is not possible!"); + GUI::HELPERS::print_warning($t); + return; + } + + $opts->{'parsed'} = + $main->{'CERT'}->parse_cert($main, $opts->{'keyname'}); + + my $tmpcert = "$main->{'tmpdir'}/cert.pem"; + my $tmpkey = "$main->{'tmpdir'}/key.pem"; + my $tmpcacert = "$main->{'tmpdir'}/cacert.pem"; + + open(OUT, ">$tmpcert") || do { + GUI::HELPERS::print_warning(_("Can't create temporary file")); + return; + }; + print OUT $opts->{'parsed'}->{'PEM'}; + close OUT; + + # store key in temporary location + { + open(IN, "<$opts->{'keyfile'}") || do { + GUI::HELPERS::print_warning(_("Can't read Key file")); + return; + }; + my @key = ; + close IN; + + open(OUT, ">$tmpkey") || do { + GUI::HELPERS::print_warning(_("Can't create temporary file")); + return; + }; + print OUT @key; + close OUT; + } + + # store cacert in temporary location + { + $opts->{'cafile'} = $main->{'cadir'}."/cacert.pem"; + open(IN, "<$opts->{'cafile'}") || do { + GUI::HELPERS::print_warning(_("Can't read CA certificate")); + return; + }; + my @cacert = ; + close IN; + + open(OUT, ">$tmpcacert") || do { + GUI::HELPERS::print_warning(_("Can't create temporary file")); + return; + }; + print OUT @cacert; + close OUT; + } + + unlink($opts->{'outfile'}); + if($opts->{'format'} eq 'ZIP') { + system($main->{'init'}->{'zipbin'}, '-j', $opts->{'outfile'}, + $tmpcacert, $tmpkey, $tmpcert); + my $ret = $? >> 8; + } elsif ($opts->{'format'} eq 'TAR') { + system($main->{'init'}->{'tarbin'}, 'cfv', $opts->{'outfile'}, + $tmpcacert, $tmpkey, $tmpcert); + my $ret = $? >> 8; + } + + if(not -s $opts->{'outfile'} || $ret) { + GUI::HELPERS::print_warning( + sprintf(_("Generating %s file failed"), + $opts->{'format'})); + } else { + $main->{'exportdir'} = HELPERS::write_export_dir($main, + $opts->{'outfile'}); + $t = sprintf( + _("Certificate and Key successfully exported to %s"), + $opts->{'outfile'}); + GUI::HELPERS::print_info($t); + } + unlink($tmpcacert); + unlink($tmpcert); + unlink($tmpkey); + + return; + + } else { + $t = sprintf(_("Invalid format for export requested: %s"), + $opts->{'format'}); + GUI::HELPERS::print_warning($t); + return; + } + + GUI::HELPERS::print_warning(_("Something Failed ??")); + + return; +} + +# check if its a dsa or rsa key +sub _check_key { + my ($main, $file, $name) = @_; + + my ($t, $type); + + open(KEY, "<$file") || do { + $t = sprintf(_("Can't open Key file: %s: %s"), + $file, $!); + GUI::HELPERS::print_warning($t); + return; + }; + + while() { + if(/RSA PRIVATE KEY/i) { + $type = "RSA"; + last; + } elsif(/DSA PRIVATE KEY/i) { + $type = "DSA"; + last; + } else { + $type = "UNKNOWN"; + } + } + close(KEY); + + if(defined($type) && $type ne "") { + $name .= "%".$type; + } + + return($name); +} + +sub key_change_passwd { + my ($self, $main, $file, $oldpass, $newpass) = @_; + my $opts = {}; + my ($t, $ret, $ext); + + my $inform = "DER"; + my $outform = "PEM"; + + my($type); + + # ckeck file format + open(KEY, "<$file") || do { + $t = sprintf(_("Can't open Key file:\n%s"), + $file); + GUI::HELPERS::print_warning($t); + return(1); + }; + while() { + if(/BEGIN RSA PRIVATE KEY/) { + $inform = "PEM"; + $type = "RSA"; + last; + } elsif(/BEGIN RSA PRIVATE KEY/){ + $inform = "PEM"; + $type = "DSA"; + last; + } else { + $type = "UNKNOWN"; + } + } + + GUI::HELPERS::set_cursor($main, 1); + + ($ret, $ext) = $main->{'OpenSSL'}->convkey( + 'type' => $type, + 'inform' => $inform, + 'outform' => $outform, + 'nopass' => 0, + 'pass' => $newpass, + 'oldpass' => $oldpass, + 'keyfile' => $file + ); + + GUI::HELPERS::set_cursor($main, 0); + + if($ret eq 1) { + $t = _("Generating key failed"); + + if($ext =~ /unable to load Private Key/) { + $t .= _("The password for your old CA Key is wrong"); + } + GUI::HELPERS::print_warning(($t), $ext); + return($ret); + } + + return($ret); +} + +1 diff --git a/lib/OpenSSL.pm b/lib/OpenSSL.pm new file mode 100644 index 0000000..3422bcf --- /dev/null +++ b/lib/OpenSSL.pm @@ -0,0 +1,1079 @@ +# Copyright (c) Stephan Martin +# +# $Id: OpenSSL.pm,v 1.14 2006/07/13 22:36:13 sm Exp $ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + +use strict; + +package OpenSSL; + +use POSIX; +use IPC::Open3; +use Time::Local; + +sub new { + my $self = {}; + my ($that, $opensslbin, $tmpdir) = @_; + my $class = ref($that) || $that; + + $self->{'bin'} = $opensslbin; + my $t = sprintf("Can't execute OpenSSL: %s", $self->{'bin'}); + GUI::HELPERS::print_error($t) + if (! -x $self->{'bin'}); + + $self->{'tmp'} = $tmpdir; + + open(TEST, "$self->{'bin'} version|"); + my $v = ; + close(TEST); + + # set version (format: e.g. 0.9.7 or 0.9.7a) + if($v =~ /\b(0\.9\.[678][a-z]?)\b/) { + $self->{'version'} = $1; + } + + # CRL output was broken before openssl 0.9.7f + if($v =~ /\b0\.9\.[0-6][a-z]?\b/ || $v =~ /\b0\.9\.7[a-e]?\b/) { + $self->{'broken'} = 1; + } else { + $self->{'broken'} = 0; + } + + bless($self, $class); +} + +sub newkey { + my $self = shift; + my $opts = { @_ }; + + my ($cmd, $ext, $c, $i, $box, $bar, $t, $param, $pid, $ret); + + if(defined($opts->{'algo'}) && $opts->{'algo'} eq "dsa") { + $param = HELPERS::mktmp($self->{'tmp'}."/param"); + + $cmd = "$self->{'bin'} dsaparam"; + $cmd .= " -out $param"; + $cmd .= " $opts->{'bits'}"; + my($rdfh, $wtfh); + $ext = "$cmd\n\n"; + $pid = open3($wtfh, $rdfh, $rdfh, $cmd); + $t = _("Creating DSA key in progress..."); + ($box, $bar) = GUI::HELPERS::create_activity_bar($t); + $i = 0; + while(defined($c = getc($rdfh))) { + $ext .= $c; + $bar->pulse(); + while(Gtk2->events_pending) { + Gtk2->main_iteration; + } + } + $box->destroy(); + waitpid($pid, 0); + $ret = $? >> 8; + return($ret, $ext) if($ret); + + $cmd = "$self->{'bin'} gendsa"; + $cmd .= " -des3"; + $cmd .= " -passout env:SSLPASS"; + $cmd .= " -out \"$opts->{'outfile'}\""; + $cmd .= " $param"; + } else { + $cmd = "$self->{'bin'} genrsa"; + $cmd .= " -des3"; + $cmd .= " -passout env:SSLPASS"; + + $cmd .= " -out \"$opts->{'outfile'}\""; + + $cmd .= " $opts->{'bits'}"; + } + + $ENV{'SSLPASS'} = $opts->{'pass'}; + my($rdfh, $wtfh); + $ext = "$cmd\n\n"; + $pid = open3($wtfh, $rdfh, $rdfh, $cmd); + $t = _("Creating RSA key in progress..."); + ($box, $bar) = GUI::HELPERS::create_activity_bar($t); + $i = 0; + while(defined($c = getc($rdfh))) { + $ext .= $c; +#$bar->update(($i++%100)/100); + $bar->pulse(); + while(Gtk2->events_pending) { + Gtk2->main_iteration; + } + } + $box->destroy(); + + waitpid($pid, 0); + $ret = $? >> 8; + + if(defined($param) && $param ne '') { + unlink($param); + } + + delete($ENV{'SSLPASS'}); + + return($ret, $ext); +} + +sub signreq { + my $self = shift; + my $opts = { @_ }; + + my ($ext, $cmd, $pid, $ret); + + $cmd = "$self->{'bin'} ca -batch"; + $cmd .= " -passin env:SSLPASS -notext"; + $cmd .= " -config $opts->{'config'}"; + $cmd .= " -name $opts->{'caname'}" if($opts->{'caname'} ne ""); + $cmd .= " -in \"$opts->{'reqfile'}\""; + $cmd .= " -days $opts->{'days'}"; + $cmd .= " -preserveDN"; + $cmd .= " -md $opts->{'digest'}" if($opts->{'digest'}); + + if(defined($opts->{'mode'}) && $opts->{'mode'} eq "sub") { + $cmd .= " -keyfile \"$opts->{'keyfile'}\""; + $cmd .= " -cert \"$opts->{'cacertfile'}\""; + $cmd .= " -outdir \"$opts->{'outdir'}\""; + $ENV{'SSLPASS'} = $opts->{'parentpw'}; + } else { + $ENV{'SSLPASS'} = $opts->{'pass'}; + } + + if(defined($opts->{'sslservername'}) && $opts->{'sslservername'} ne 'none') { + $ENV{'NSSSLSERVERNAME'} = $opts->{'sslservername'}; + } + if(defined($opts->{'revocationurl'}) && $opts->{'revocationurl'} ne 'none') { + $ENV{'NSREVOCATIONURL'} = $opts->{'revocationurl'}; + } + if(defined($opts->{'renewalurl'}) && $opts->{'renewalurl'} ne 'none') { + $ENV{'NSRENEWALURL'} = $opts->{'renewalurl'}; + } + if($opts->{'subjaltname'} ne 'none' && + $opts->{'subjaltname'} ne 'emailcopy') { + if($opts->{'subjaltnametype'} eq 'ip') { + $ENV{'SUBJECTALTNAMEIP'} = HELPERS::gen_subjectaltname_contents('IP:', $opts->{'subjaltname'}); + }elsif($opts->{'subjaltnametype'} eq 'dns') { + $ENV{'SUBJECTALTNAMEDNS'} = HELPERS::gen_subjectaltname_contents('DNS:', $opts->{'subjaltname'}); + }elsif($opts->{'subjaltnametype'} eq 'mail') { + $ENV{'SUBJECTALTNAMEEMAIL'} = HELPERS::gen_subjectaltname_contents('email:', $opts->{'subjaltname'}); + }elsif($opts->{'subjaltnametype'} eq 'raw') { + $ENV{'SUBJECTALTNAMERAW'} = HELPERS::gen_subjectaltname_contents(undef, $opts->{'subjaltname'}); + } + } + if($opts->{'extendedkeyusage'} ne 'none') { + $ENV{'EXTENDEDKEYUSAGE'} = $opts->{'extendedkeyusage'}; + } + + if(defined($opts->{'noemaildn'}) && $opts->{'noemaildn'}) { + $cmd .= " -noemailDN"; + } + + # print STDERR "DEBUG call cmd: $cmd\n"; + + my($rdfh, $wtfh); + $pid = open3($wtfh, $rdfh, $rdfh, $cmd); + $ext = "$cmd\n\n"; + while(<$rdfh>) { + # print STDERR "DEBUG cmd returns: $_\n"; + $ext .= $_; + if($_ =~ /unable to load CA private key/) { + delete($ENV{'SSLPASS'}); + $ENV{'NSSSLSERVERNAME'} = 'dummy'; + $ENV{'NSREVOCATIONURL'} = 'dummy'; + $ENV{'NSRENEWALURL'} = 'dummy'; + $ENV{'SUBJECTALTNAMEIP'} = 'dummy'; + $ENV{'SUBJECTALTNAMEDNS'} = 'dummy'; + $ENV{'SUBJECTALTNAMEEMAIL'} = 'dummy'; + $ENV{'SUBJECTALTNAMERAW'} = 'dummy'; + $ENV{'EXTENDEDKEYUSAGE'} = 'dummy'; + waitpid($pid, 0); + return(1, $ext); + } elsif($_ =~ /trying to load CA private key/) { + delete($ENV{'SSLPASS'}); + $ENV{'NSSSLSERVERNAME'} = 'dummy'; + $ENV{'NSREVOCATIONURL'} = 'dummy'; + $ENV{'NSRENEWALURL'} = 'dummy'; + $ENV{'SUBJECTALTNAMEIP'} = 'dummy'; + $ENV{'SUBJECTALTNAMEDNS'} = 'dummy'; + $ENV{'SUBJECTALTNAMEEMAIL'} = 'dummy'; + $ENV{'SUBJECTALTNAMERAW'} = 'dummy'; + $ENV{'EXTENDEDKEYUSAGE'} = 'dummy'; + waitpid($pid, 0); + return(2, $ext); + } elsif($_ =~ /There is already a certificate for/) { + delete($ENV{'SSLPASS'}); + $ENV{'NSSSLSERVERNAME'} = 'dummy'; + $ENV{'NSREVOCATIONURL'} = 'dummy'; + $ENV{'NSRENEWALURL'} = 'dummy'; + $ENV{'SUBJECTALTNAMEIP'} = 'dummy'; + $ENV{'SUBJECTALTNAMEDNS'} = 'dummy'; + $ENV{'SUBJECTALTNAMEEMAIL'} = 'dummy'; + $ENV{'SUBJECTALTNAMERAW'} = 'dummy'; + $ENV{'EXTENDEDKEYUSAGE'} = 'dummy'; + waitpid($pid, 0); + return(3, $ext); + } elsif($_ =~ /bad ip address/) { + delete($ENV{'SSLPASS'}); + $ENV{'NSSSLSERVERNAME'} = 'dummy'; + $ENV{'NSREVOCATIONURL'} = 'dummy'; + $ENV{'NSRENEWALURL'} = 'dummy'; + $ENV{'SUBJECTALTNAMEIP'} = 'dummy'; + $ENV{'SUBJECTALTNAMEDNS'} = 'dummy'; + $ENV{'SUBJECTALTNAMEEMAIL'} = 'dummy'; + $ENV{'SUBJECTALTNAMERAW'} = 'dummy'; + $ENV{'EXTENDEDKEYUSAGE'} = 'dummy'; + waitpid($pid, 0); + return(4, $ext); + } + } + waitpid($pid, 0); + $ret = $? >> 8; + + delete($ENV{'SSLPASS'}); + $ENV{'NSSSLSERVERNAME'} = 'dummy'; + $ENV{'NSREVOCATIONURL'} = 'dummy'; + $ENV{'NSRENEWALURL'} = 'dummy'; + $ENV{'SUBJECTALTNAMEIP'} = 'dummy'; + $ENV{'SUBJECTALTNAMEDNS'} = 'dummy'; + $ENV{'SUBJECTALTNAMEEMAIL'} = 'dummy'; + $ENV{'SUBJECTALTNAMERAW'} = 'dummy'; + $ENV{'EXTENDEDKEYUSAGE'} = 'dummy'; + + return($ret, $ext); +} + +sub revoke { + my $self = shift; + my $opts = { @_ }; + + my ($ext, $cmd, $ret, $pid); + + $cmd = "$self->{'bin'} ca"; + $cmd .= " -passin env:SSLPASS"; + + $cmd .= " -config $opts->{'config'}"; + $cmd .= " -revoke $opts->{'infile'}"; + + if($opts->{'reason'} ne 'none') { + $cmd .= " -crl_reason $opts->{'reason'}"; + } + + $ENV{'SSLPASS'} = $opts->{'pass'}; + my($rdfh, $wtfh); + $ext = "$cmd\n\n"; + $pid = open3($wtfh, $rdfh, $rdfh, $cmd); + while(<$rdfh>) { + $ext .= $_; + if($_ =~ /unable to load CA private key/) { + delete($ENV{'SSLPASS'}); + waitpid($pid, 0); + return(1, $ext); + } elsif($_ =~ /trying to load CA private key/) { + delete($ENV{'SSLPASS'}); + waitpid($pid, 0); + return(2, $ext); + } elsif($_ =~ /^ERROR:/) { + delete($ENV{'SSLPASS'}); + waitpid($pid, 0); + return(3, $ext); + } + } + waitpid($pid, 0); + $ret = $? >> 8; + + delete($ENV{'SSLPASS'}); + + return($ret, $ext); +} + +sub newreq { + my $self = shift; + my $opts = { @_ }; + + my ($ext, $ret, $cmd, $pid); + + $cmd = "$self->{'bin'} req -new"; + $cmd .= " -keyform PEM"; + $cmd .= " -outform PEM"; + $cmd .= " -passin env:SSLPASS"; + + $cmd .= " -config $opts->{'config'}"; + $cmd .= " -out $opts->{'outfile'}"; + $cmd .= " -key $opts->{'keyfile'}"; + $cmd .= " -"."$opts->{'digest'}"; + + $ENV{'SSLPASS'} = $opts->{'pass'}; + print "DEBUG call: $cmd\n"; + + my($rdfh, $wtfh); + $ext = "$cmd\n\n"; + $pid = open3($wtfh, $rdfh, $rdfh, $cmd); + + foreach(@{$opts->{'dn'}}) { + print "DEBUG: add to dn: $_\n"; + if(defined($_)) { + print $wtfh "$_\n"; + } else { + print $wtfh ".\n"; + } + } + + while(<$rdfh>) { + $ext .= $_; + } + waitpid($pid, 0); + $ret = $? >> 8; + + print "DEBUG return: $ext\n"; + + delete($ENV{'SSLPASS'}); + + return($ret, $ext); +} + +sub newcert { + my $self = shift; + my $opts = { @_ }; + + my ($ext, $cmd, $ret, $pid); + + $cmd = "$self->{'bin'} req -x509"; + $cmd .= " -keyform PEM"; + $cmd .= " -outform PEM"; + $cmd .= " -passin env:SSLPASS"; + + $cmd .= " -config $opts->{'config'}"; + $cmd .= " -out \"$opts->{'outfile'}\""; + $cmd .= " -key \"$opts->{'keyfile'}\""; + $cmd .= " -in \"$opts->{'reqfile'}\""; + $cmd .= " -days $opts->{'days'}"; + $cmd .= " -"."$opts->{'digest'}"; + + $ENV{'SSLPASS'} = $opts->{'pass'}; + + my($rdfh, $wtfh); + $ext = "$cmd\n\n"; + $pid = open3($wtfh, $rdfh, $rdfh, $cmd); + while(<$rdfh>) { + $ext .= $_; + } + waitpid($pid, 0); + $ret = $? >> 8; + + delete($ENV{'SSLPASS'}); + + return($ret, $ext); +} + +sub newcrl { + my $self = shift; + my $opts = { @_ }; + + my ($out, $ext, $tmpfile, $cmd, $ret, $pid, $crl); + + $tmpfile = HELPERS::mktmp($self->{'tmp'}."/crl"); + $cmd = "$self->{'bin'} ca -gencrl"; + $cmd .= " -passin env:SSLPASS"; + $cmd .= " -config $opts->{'config'}"; + + $cmd .= " -out $tmpfile"; + $cmd .= " -crldays $opts->{'crldays'}"; + + $ENV{'SSLPASS'} = $opts->{ 'pass'}; + my($rdfh, $wtfh); + $ext = "$cmd\n\n"; + #print STDERR "DEBUG: cmd: $cmd"; + $pid = open3($wtfh, $rdfh, $rdfh, $cmd); + while(<$rdfh>) { + $ext .= $_; + #print STDERR "DEBUG: cmd return: $_"; + if($_ =~ /unable to load CA private key/) { + delete($ENV{'SSLPASS'}); + waitpid($pid, 0); + return(1, $ext); + } elsif($_ =~ /trying to load CA private key/) { + delete($ENV{'SSLPASS'}); + waitpid($pid, 0); + return(2, $ext); + } + } + waitpid($pid, 0); + $ret = $?>>8; + + delete($ENV{'SSLPASS'}); + + return($ret, $ext) if($ret); + + $crl = $self->parsecrl($tmpfile, 1); + unlink( $tmpfile); + + $opts->{'format'} = 'PEM' if ( !defined( $opts->{ 'format'})); + if($opts->{'format'} eq 'PEM') { + $out = $crl->{'PEM'}; + } elsif ($opts->{'format'} eq 'DER') { + $out = $crl->{'DER'}; + } elsif ($opts->{'format'} eq 'TXT') { + $out = $crl->{'TXT'}; + } else { + $out = $crl->{'PEM'}; + } + + unlink( $opts->{'outfile'}); + open(OUT, ">$opts->{'outfile'}") or return; + print OUT $out; + close OUT; + + return($ret, $ext); +} + +sub parsecrl { + my ($self, $file, $force) = @_; + + my $tmp = {}; + my (@lines, $i, $t, $ext, $ret); + + # check if crl is cached + if($self->{'CACHE'}->{$file} && not $force) { + return($self->{'CACHE'}->{$file}); + } + delete($self->{'CACHE'}->{$file}); + + open(IN, $file) || do { + $t = sprintf(_("Can't open CRL '%s': %s"), $file, $!); + GUI::HELPERS::print_warning($t); + return; + }; + + # convert crl to PEM, DER and TEXT + $tmp->{'PEM'} .= $_ while(); + ($ret, $tmp->{'TXT'}, $ext) = $self->convdata( + 'cmd' => 'crl', + 'data' => $tmp->{'PEM'}, + 'inform' => 'PEM', + 'outform' => 'TEXT' + ); + + if($ret) { + $t = _("Error converting CRL"); + GUI::HELPERS::print_warning($t, $ext); + return; + } + + ($ret, $tmp->{'DER'}, $ext) = $self->convdata( + 'cmd' => 'crl', + 'data' => $tmp->{'PEM'}, + 'inform' => 'PEM', + 'outform' => 'DER' + ); + + if($ret) { + $t = _("Error converting CRL"); + GUI::HELPERS::print_warning($t, $ext); + return; + } + + # get "normal infos" + if ($tmp->{'TXT'}) { + @lines = split(/\n/, $tmp->{'TXT'}); + } else { + @lines = (); + } + foreach(@lines) { + if ($_ =~ /Signature Algorithm.*: (\w+)/i) { + $tmp->{'SIG_ALGORITHM'} = $1; + } elsif ($_ =~ /Issuer: (.+)/i) { + $tmp->{'ISSUER'} = $1; + $tmp->{'ISSUER'} =~ s/,/\//g; + $tmp->{'ISSUER'} =~ s/\/ /\//g; + $tmp->{'ISSUER'} =~ s/^\///; + } elsif ($_ =~ /Last Update.*: (.+)/i) { + $tmp->{'LAST_UPDATE'} = $1; + } elsif ($_ =~ /Next Update.*: (.+)/i) { + $tmp->{'NEXT_UPDATE'} = $1; + } + } + + # get revoked certs + $tmp->{'LIST'} = []; + for($i = 0; + ($i < scalar(@lines)) && + ($lines[$i] !~ /^[\s\t]*Revoked Certificates:$/i); + $i++) { + $self->{'CACHE'}->{$file} = $tmp; + return($tmp) if ($lines[$i] =~ /No Revoked Certificates/i); + } + $i++; + + while($i < @lines) { + if($lines[$i] =~ /Serial Number.*: (.+)/i) { + my $t= {}; + $t->{'SERIAL'} = length($1)%2?"0".uc($1):uc($1); + $i++; + if($lines[$i] =~ /Revocation Date: (.*)/i ) { + $t->{'DATE'} = $1; + $i++; + #print STDERR "read CRL: $t->{'SERIAL'}\n"; + push(@{$tmp->{'LIST'}}, $t); + } else { + $t = sprintf("CRL seems to be corrupt: %s\n", $file); + GUI::HELPERS::print_warning($t); + return; + } + + } else { + $i++; + } + } + + $self->{'CACHE'}->{$file} = $tmp; + + return($tmp); +} + +sub parsecert { + my ($self, $crlfile, $indexfile, $file, $force) = @_; + + my $tmp = {}; + my (@lines, $dn, $i, $c, $v, $k, $cmd, $crl, $time, $t, $ext, $ret, $pid); + + $time = time(); + + $force && delete($self->{'CACHE'}->{$file}); + + #print STDERR "DEBUG: got force $force\n"; + + # check if certificate is cached + if($self->{'CACHE'}->{$file}) { + # print "DEBUG: use cached certificate $file\n"; + return($self->{'CACHE'}->{$file}); + } + # print "DEBUG: parse certificate $file\n"; + + open(IN, $file) || do { + $t = sprintf("Can't open Certificate '%s': %s", $file, $!); + GUI::HELPERS::print_warning($t); + return; + }; + + # convert certificate to PEM, DER and TEXT + $tmp->{'PEM'} .= $_ while(); + ($ret, $tmp->{'TEXT'}, $ext) = $self->convdata( + 'cmd' => 'x509', + 'data' => $tmp->{'PEM'}, + 'inform' => 'PEM', + 'outform' => 'TEXT' + ); + + if($ret) { + $t = _("Error converting Certificate"); + GUI::HELPERS::print_warning($t, $ext); + return; + } + + ($ret, $tmp->{'DER'}, $ext) = $self->convdata( + 'cmd' => 'x509', + 'data' => $tmp->{'PEM'}, + 'inform' => 'PEM', + 'outform' => 'DER' + ); + + if($ret) { + $t = _("Error converting Certificate"); + GUI::HELPERS::print_warning($t, $ext); + return; + } + + # get "normal infos" + @lines = split(/\n/, $tmp->{'TEXT'}); + foreach(@lines) { + if($_ =~ /Serial Number.*: (.+) /i) { + # shit, -text shows serial as decimal number :( + # dirty fix (incompleted) --curly + $i = sprintf( "%x", $1); + $tmp->{'SERIAL'} = length($i)%2?"0".uc($i):uc($i); + } elsif ($_ =~ /Signature Algorithm.*: (\w+)/i) { + $tmp->{'SIG_ALGORITHM'} = $1; + } elsif ($_ =~ /Issuer: (.+)/i) { + $tmp->{'ISSUER'} = $1; + $tmp->{'ISSUER'} =~ s/,/\//g; + $tmp->{'ISSUER'} =~ s/\/ /\//g; + $tmp->{'ISSUER'} =~ s/^\///; + } elsif ($_ =~ /Not Before.*: (.+)/i) { + $tmp->{'NOTBEFORE'} = $1; + } elsif ($_ =~ /Not After.*: (.+)/i) { + $tmp->{'NOTAFTER'} = $1; + } elsif ($_ =~ /Public Key Algorithm.*: (.+)/i) { + $tmp->{'PK_ALGORITHM'} = $1; + } elsif ($_ =~ /Modulus \((\d+) .*\)/i) { + $tmp->{'KEYSIZE'} = $1; + } elsif ($_ =~ /Subject.*: (.+)/i) { + $tmp->{'DN'} = $1; + } + } + + # parse subject DN + $dn = HELPERS::parse_dn($tmp->{'DN'}); + foreach(keys(%$dn)) { + $tmp->{$_} = $dn->{$_}; + } + + # parse issuer DN + $tmp->{'ISSUERDN'} = HELPERS::parse_dn($tmp->{'ISSUER'}); + + # get extensions + $tmp->{'EXT'} = HELPERS::parse_extensions(\@lines, "cert"); + + # get fingerprint + $cmd = "$self->{'bin'} x509 -noout -fingerprint -md5 -in $file"; + my($rdfh, $wtfh); + $ext = "$cmd\n\n"; + $pid = open3($wtfh, $rdfh, $rdfh, $cmd); + while(<$rdfh>){ + $ext .= $_; + ($k, $v) = split(/=/); + $tmp->{'FINGERPRINTMD5'} = $v if($k =~ /MD5 Fingerprint/i); + chomp($tmp->{'FINGERPRINTMD5'}); + } + waitpid($pid, 0); + $ret = $? >> 8; + + if($ret) { + $t = _("Error reading fingerprint from Certificate"); + GUI::HELPERS::print_warning($t, $ext); + } + + $cmd = "$self->{'bin'} x509 -noout -fingerprint -sha1 -in $file"; + $ext = "$cmd\n\n"; + $pid = open3($wtfh, $rdfh, $rdfh, $cmd); + while(<$rdfh>){ + $ext .= $_; + ($k, $v) = split(/=/); + $tmp->{'FINGERPRINTSHA1'} = $v if($k =~ /SHA1 Fingerprint/i); + chomp($tmp->{'FINGERPRINTSHA1'}); + } + waitpid($pid, 0); + $ret = $? >> 8; + + if($ret) { + $t = _("Error reading fingerprint from Certificate"); + GUI::HELPERS::print_warning($t, $ext); + } + + # get subject in openssl format + $cmd = "$self->{'bin'} x509 -noout -subject -in $file"; + $ext = "$cmd\n\n"; + $pid = open3($wtfh, $rdfh, $rdfh, $cmd); + while(<$rdfh>){ + $ext .= $_; + if($_ =~ /subject= (.*)/) { + $tmp->{'SUBJECT'} = $1; + } + } + waitpid($pid, 0); + $ret = $? >> 8; + + if($ret) { + $t = _("Error reading subject from Certificate"); + GUI::HELPERS::print_warning($t, $ext); + } + + $tmp->{'EXPDATE'} = _get_date( $tmp->{'NOTAFTER'}); + + if(defined($crlfile) && defined($indexfile)) { + $crl = $self->parsecrl($crlfile, 1); + #print STDERR "DEBUG: parsed crl $crlfile : $crl\n"; + + defined($crl) || GUI::HELPERS::print_error(_("Can't read CRL")); + + $tmp->{'STATUS'} = _("VALID"); + + if($tmp->{'EXPDATE'} < $time) { + $tmp->{'STATUS'} = _("EXPIRED"); + # keep database up to date + if($crl->{'ISSUER'} eq $tmp->{'ISSUER'}) { + _set_expired($tmp->{'SERIAL'}, $indexfile); + } + } + + if (defined($tmp->{'SERIAL'})) { + foreach my $revoked (@{$crl->{'LIST'}}) { + #print STDERR "DEBUG: check tmp: $tmp->{'SERIAL'}\n"; + #print STDERR "DEBUG: check revoked: $revoked->{'SERIAL'}\n"; + next if ($tmp->{'SERIAL'} ne $revoked->{'SERIAL'}); + if ($tmp->{'SERIAL'} eq $revoked->{'SERIAL'}) { + $tmp->{'STATUS'} = _("REVOKED"); + } + } + } + } else { + $tmp->{'STATUS'} = _("UNDEFINED"); + } + + $self->{'CACHE'}->{$file} = $tmp; + + return($tmp); +} + +sub parsereq { + my ($self, $config, $file, $force) = @_; + + my $tmp = {}; + + my (@lines, $dn, $i, $c, $v, $k, $cmd, $t, $ext, $ret); + + # check if request is cached + if($self->{'CACHE'}->{$file} && !$force) { + # print STDERR "DEBUG return from CACHE $file\n"; + return($self->{'CACHE'}->{$file}); + } elsif($force) { + # print STDERR "DEBUG delete from CACHE $file\n"; + delete($self->{'CACHE'}->{$file}); + } else { + # print STDERR "DEBUG parse into CACHE $file\n"; + } + + open(IN, $file) || do { + $t = sprintf(_("Can't open Request file %s: %s"), $file, $!); + GUI::HELPERS::print_warning($t); + return; + }; + + # convert request to PEM, DER and TEXT + $tmp->{'PEM'} .= $_ while(); + + ($ret, $tmp->{'TEXT'}, $ext) = $self->convdata( + 'cmd' => 'req', + 'config' => $config, + 'data' => $tmp->{'PEM'}, + 'inform' => 'PEM', + 'outform' => 'TEXT' + ); + + if($ret) { + $t = _("Error converting Request"); + GUI::HELPERS::print_warning($t, $ext); + return; + } + + ($ret, $tmp->{'DER'}, $ext) = $self->convdata( + 'cmd' => 'req', + 'config' => $config, + 'data' => $tmp->{'PEM'}, + 'inform' => 'PEM', + 'outform' => 'DER' + ); + + if($ret) { + $t = _("Error converting Request"); + GUI::HELPERS::print_warning($t, $ext); + return; + } + + # get "normal infos" + @lines = split(/\n/, $tmp->{'TEXT'}); + foreach(@lines) { + if ($_ =~ /Signature Algorithm.*: (\w+)/i) { + $tmp->{'SIG_ALGORITHM'} = $1; + } elsif ($_ =~ /Public Key Algorithm.*: (.+)/i) { + $tmp->{'PK_ALGORITHM'} = $1; + } elsif ($_ =~ /Modulus \((\d+) .*\)/i) { + $tmp->{'KEYSIZE'} = $1; + # print STDERR "read keysize: $tmp->{'KEYSIZE'}\n"; + } elsif ($_ =~ /Subject.*: (.+)/i) { + $tmp->{'DN'} = $1; + } elsif ($_ =~ /Version: \d.*/i) { + $tmp->{'TYPE'} = 'PKCS#10'; + } + } + + $dn = HELPERS::parse_dn($tmp->{'DN'}); + foreach(keys(%$dn)) { + $tmp->{$_} = $dn->{$_}; + } + + # get extensions + $tmp->{'EXT'} = HELPERS::parse_extensions(\@lines, "req"); + + $self->{'CACHE'}->{$file} = $tmp; + + return($tmp); +} + +sub convdata { + my $self = shift; + my $opts = { @_ }; + + my ($tmp, $ext, $ret, $file, $pid, $cmd); + $file = HELPERS::mktmp($self->{'tmp'}."/data"); + + $cmd = "$self->{'bin'} $opts->{'cmd'}"; + $cmd .= " -config $opts->{'config'}" if(defined($opts->{'config'})); + $cmd .= " -inform $opts->{'inform'}"; + $cmd .= " -out \"$file\""; + if($opts->{'outform'} eq 'TEXT') { + $cmd .= " -text -noout"; + } else { + $cmd .= " -outform $opts->{'outform'}"; + } + + my($rdfh, $wtfh); + $ext = "$cmd\n\n"; + $pid = open3($wtfh, $rdfh, $rdfh, $cmd); + print $wtfh "$opts->{'data'}\n"; + while(<$rdfh>){ + $ext .= $_; + # print STDERR "DEBUG: cmd ret: $_"; + }; + waitpid($pid, 0); + $ret = $?>>8; + + if($self->{'broken'}) { + if(($ret != 0 && $opts->{'cmd'} ne 'crl') || + ($ret != 0 && $opts->{'outform'} ne 'TEXT' && $opts->{'cmd'} eq 'crl') || + ($ret != 1 && $opts->{'outform'} eq 'TEXT' && $opts->{'cmd'} eq 'crl')) { + unlink($file); + return($ret, undef, $ext); + } else { + $ret = 0; + } + } else { # wow, they fixed it :-) + if($ret != 0) { + unlink($file); + return($ret, undef, $ext); + } else { + $ret = 0; + } + } + + open(IN, $file) || do { + my $t = sprintf(_("Can't open file %s: %s"), $file, $!); + GUI::HELPERS::print_warning($t); + return; + }; + $tmp .= $_ while(); + close(IN); + + unlink($file); + + return($ret, $tmp, $ext); +} + +sub convkey { + my $self = shift; + my $opts = { @_ }; + + my ($tmp, $ext, $pid, $ret); + my $file = HELPERS::mktmp($self->{'tmp'}."/key"); + + my $cmd = "$self->{'bin'}"; + + # print STDERR "DEBUG: got type: $opts->{'type'}\n"; + + if($opts->{'type'} eq "RSA") { + $cmd .= " rsa"; + } elsif($opts->{'type'} eq "DSA") { + $cmd .= " dsa"; + } + + $cmd .= " -inform $opts->{'inform'}"; + $cmd .= " -outform $opts->{'outform'}"; + $cmd .= " -in \"$opts->{'keyfile'}\""; + $cmd .= " -out \"$file\""; + + $cmd .= " -passin env:SSLPASS"; + $cmd .= " -passout env:SSLPASSOUT -des3" if(not $opts->{'nopass'}); + + $ENV{'SSLPASS'} = defined($opts->{'oldpass'}) ? $opts->{'oldpass'} : + $opts->{'pass'}; + $ENV{'SSLPASSOUT'} = $opts->{'pass'} if(not $opts->{'nopass'}); + + my($rdfh, $wtfh); + $ext = "$cmd\n\n"; + $pid = open3($wtfh, $rdfh, $rdfh, $cmd); + while(<$rdfh>) { + $ext .= $_; + if($_ =~ /unable to load key/) { + delete($ENV{'SSLPASS'}); + delete($ENV{'SSLPASSOUT'}); + return(1, $ext); + } + } + waitpid($pid, 0); + $ret = $? >> 8; + + delete($ENV{'SSLPASS'}); + delete($ENV{'SSLPASSOUT'}); + + return(1, $ext) if($ret); + + open(IN, $file) || return(undef); + $tmp .= $_ while(); + close(IN); + + unlink($file); + + return($tmp); +} + +sub genp12 { + my $self = shift; + my $opts = { @_ }; + + my($cmd, $ext, $ret, $pid); + + $cmd = "$self->{'bin'} pkcs12 -export"; + $cmd .= " -out \"$opts->{'outfile'}\""; + $cmd .= " -in \"$opts->{'certfile'}\""; + $cmd .= " -inkey \"$opts->{'keyfile'}\""; + if(not $opts->{'nopass'}) { + $cmd .= " -passout env:P12PASS"; + } else { + $cmd .= " -passout pass:"; + } + $cmd .= " -passin env:SSLPASS"; + $cmd .= " -certfile $opts->{'cafile'}" if($opts->{'includeca'}); + $cmd .= " -nodes " if($opts->{'nopass'}); + $cmd .= " -name \"$opts->{'friendly'}\"" if($opts->{'friendly'} ne ""); + + + $ENV{'P12PASS'} = $opts->{'p12passwd'} if(not $opts->{'nopass'}); + $ENV{'SSLPASS'} = $opts->{'passwd'}; + my($rdfh, $wtfh); + $ext = "$cmd\n\n"; + $pid = open3($wtfh, $rdfh, $rdfh, $cmd); + while(<$rdfh>) { + $ext .= $_; + if($_ =~ /Error loading private key/) { + delete($ENV{'SSLPASS'}); + delete($ENV{'P12PASS'}); + return(1, $ext); + } + } + waitpid($pid, 0); + $ret = $? >> 8; + + delete($ENV{'P12PASS'}); + delete($ENV{'SSLPASS'}); + + return($ret, $ext); +} + +sub read_index { + my ($self, $index) = @_; + + my (@lines, @index); + + open(IN, "<$index") || do { + my $t = sprintf(_("Can't read index %s: %s"), $index, $!); + GUI::HELPERS::print_warning($t); + return; + }; + @lines = ; + close(IN); + foreach my $l (@lines) { + my $tmp = {}; + ($tmp->{'STATUS'}, + $tmp->{'EXPDATE'}, + $tmp->{'REVDATE'}, + $tmp->{'SERIAL'}, + $tmp->{'xxx'}, + $tmp->{'DN'}) = split(/\t/, $l); + + ($tmp->{'REVDATE'}, $tmp->{'REVREASON'}) = split(/,/, $tmp->{'REVDATE'}); + + $tmp->{'EXPDATE'} = _get_index_date($tmp->{'EXPDATE'}); + if(defined($tmp->{'REVDATE'}) && ($tmp->{'REVDATE'} ne '')) { + $tmp->{'REVDATE'} = _get_index_date( $tmp->{'REVDATE'}); + } + + push(@index, $tmp); + } + + return(@index); +} + +sub _set_expired { + my ($serial, $index) =@_; + + open(IN, "<$index") || do { + my $t = sprintf(_("Can't read index %s: %s"), $index, $!); + GUI::HELPERS::print_warning($t); + return; + }; + + my @lines = ; + + close IN; + + open(OUT, ">$index") || do { + my $t = sprintf(_("Can't write index %s: %s"), $index, $!); + GUI::HELPERS::print_warning($t); + return; + }; + + foreach my $l (@lines) { + if($l =~ /\t$serial\t/) { + $l =~ s/^V/E/; + } + print OUT $l; + } + + close OUT; + + return; +} + +sub _get_date { + my $string = shift; + + $string =~ s/ / /g; + + my @t1 = split(/ /, $string); + my @t2 = split(/:/, $t1[2]); + + $t1[0] = _get_index($t1[0]); + + my $ret = Time::Local::timelocal($t2[2],$t2[1],$t2[0],$t1[1],$t1[0],$t1[3]); + + return($ret); +} + +sub _get_index_date { + my $string = shift; + + my ($y, $m, $d); + + $y = substr($string, 0, 2) + 2000; + $m = substr($string, 2, 2) - 1; + $d = substr($string, 4, 2); + + my $ret = Time::Local::timelocal(0, 0, 0, $d, $m, $y); + + return($ret); +} + +sub _get_index { + my $m = shift; + + my @a = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); + + for(my $i = 0; $a[$i]; $i++) { + return $i if($a[$i] eq $m); + } +} + +1 diff --git a/lib/REQ.pm b/lib/REQ.pm new file mode 100644 index 0000000..a3b6138 --- /dev/null +++ b/lib/REQ.pm @@ -0,0 +1,777 @@ +# Copyright (c) Stephan Martin +# +# $Id: REQ.pm,v 1.7 2006/06/28 21:50:42 sm Exp $ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + +use strict; + +package REQ; + +use POSIX; + +sub new { + my $that = shift; + my $class = ref($that) || $that; + + my $self = {}; + + $self->{'OpenSSL'} = shift; + + bless($self, $class); +} + +# +# check if all data for creating a new request is available +# +sub get_req_create { + my ($self, $main, $opts, $box) = @_; + + $box->destroy() if(defined($box)); + + my ($name, $action, $parsed, $reqfile, $keyfile, $ca, $t); + + $ca = $main->{'CA'}->{'actca'}; + + if(!(defined($opts)) || !(ref($opts))) { + if(defined($opts) && $opts eq "signserver") { + $opts = {}; + $opts->{'sign'} = 1; + $opts->{'type'} = "server"; + } elsif(defined($opts) && $opts eq "signclient") { + $opts = {}; + $opts->{'sign'} = 1; + $opts->{'type'} = "client"; + } elsif (defined($opts)) { + $t = sprintf(_("Strange value for 'opts': %s"), $opts); + GUI::HELPERS::print_error($t); + } + $opts->{'bits'} = 4096; + $opts->{'digest'} = 'sha1'; + $opts->{'algo'} = 'rsa'; + if(defined($opts) && $opts eq "sign") { + $opts->{'sign'} = 1; + } + + $parsed = $main->{'CERT'}->parse_cert($main, 'CA'); + + defined($parsed) || + GUI::HELPERS::print_error(_("Can't read CA certificate")); + + # set defaults + if(defined $parsed->{'C'}) { + $opts->{'C'} = $parsed->{'C'}; + } + if(defined $parsed->{'ST'}) { + $opts->{'ST'} = $parsed->{'ST'}; + } + if(defined $parsed->{'L'}) { + $opts->{'L'} = $parsed->{'L'}; + } + if(defined $parsed->{'O'}) { + $opts->{'O'} = $parsed->{'O'}; + } + my $cc = 0; + foreach my $ou (@{$parsed->{'OU'}}) { + $opts->{'OU'}->[$cc++] = $ou; + } + + $main->show_req_dialog($opts); + return; + } + + if((not defined($opts->{'CN'})) || + ($opts->{'CN'} eq "") || + (not defined($opts->{'passwd'})) || + ($opts->{'passwd'} eq "")) { + $main->show_req_dialog($opts); + GUI::HELPERS::print_warning( + _("Please specify at least Common Name ") + ._("and Password")); + return; + } + + if((not defined($opts->{'passwd2'})) || + $opts->{'passwd'} ne $opts->{'passwd2'}) { + $main->show_req_dialog($opts); + GUI::HELPERS::print_warning(_("Passwords don't match")); + return; + } + + $opts->{'C'} = uc($opts->{'C'}); + + if((defined $opts->{'C'}) && + ($opts->{'C'} ne "") && + (length($opts->{'C'}) != 2)) { + $main->show_req_dialog($opts); + GUI::HELPERS::print_warning( + _("Country must be exact 2 letter code")); + return; + } + + $name = HELPERS::gen_name($opts); + + $opts->{'reqname'} = HELPERS::enc_base64($name); + + $reqfile = $main->{'CA'}->{$ca}->{'dir'}."/req/".$opts->{'reqname'}.".pem"; + $keyfile = $main->{'CA'}->{$ca}->{'dir'}."/keys/".$opts->{'reqname'}.".pem"; + + if(-s $reqfile || -s $keyfile) { + $main->show_req_overwrite_warning($opts); + return; + } + + $self->create_req($main, $opts); + + return; +} + +# +# create new request and key +# +sub create_req { + my ($self, $main, $opts) = @_; + + my($reqfile, $keyfile, $ca, $ret, $ext, $cadir); + + GUI::HELPERS::set_cursor($main, 1); + + $ca = $main->{'CA'}->{'actca'}; + $cadir = $main->{'CA'}->{$ca}->{'dir'}; + + $reqfile = $cadir."/req/".$opts->{'reqname'}.".pem"; + $keyfile = $cadir."/keys/".$opts->{'reqname'}.".pem"; + + ($ret, $ext) = $self->{'OpenSSL'}->newkey( + 'algo' => $opts->{'algo'}, + 'bits' => $opts->{'bits'}, + 'outfile' => $keyfile, + 'pass' => $opts->{'passwd'} + ); + + if (not -s $keyfile || $ret) { + unlink($keyfile); + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning(_("Generating key failed"), $ext); + return; + } + + my @dn = ( $opts->{'C'}, $opts->{'ST'}, $opts->{'L'}, $opts->{'O'} ); + if(ref($opts->{'OU'})) { + foreach my $ou (@{$opts->{'OU'}}) { + push(@dn,$ou); + } + } else { + push(@dn, $opts->{'OU'}); + } + @dn = (@dn, $opts->{'CN'}, $opts->{'EMAIL'}, '', ''); + ($ret, $ext) = $self->{'OpenSSL'}->newreq( + 'config' => $main->{'CA'}->{$ca}->{'cnf'}, + 'outfile' => $reqfile, + 'keyfile' => $keyfile, + 'digest' => $opts->{'digest'}, + 'pass' => $opts->{'passwd'}, + 'dn' => \@dn, + ); + + if (not -s $reqfile || $ret) { + unlink($keyfile); + unlink($reqfile); + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning(_("Generating Request failed"), $ext); + return; + } + + my $parsed = $self->parse_req($main, $opts->{'reqname'}, 1); + + $main->{'reqbrowser'}->update($cadir."/req", + $cadir."/crl/crl.pem", + $cadir."/index.txt", + 0); + + $main->{'keybrowser'}->update($cadir."/keys", + $cadir."/crl/crl.pem", + $cadir."/index.txt", + 0); + + GUI::HELPERS::set_cursor($main, 0); + + if($opts->{'sign'}) { + $opts->{'reqfile'} = $reqfile; + $opts->{'passwd'} = undef; # to sign request, ca-password is needed + $self->get_sign_req($main, $opts); + } + + return; +} + +# +# get name of requestfile to delete +# +sub get_del_req { + my ($self, $main) = @_; + + my($reqname, $req, $reqfile, $row, $ind, $ca, $cadir); + + $ca = $main->{'reqbrowser'}->selection_caname(); + $cadir = $main->{'reqbrowser'}->selection_cadir(); + + if(not(defined($reqfile))) { + $req = $main->{'reqbrowser'}->selection_dn(); + + + if(not defined($req)) { + GUI::HELPERS::print_info(_("Please select a Request first")); + return; + } + + $reqname = HELPERS::enc_base64($req); + $reqfile = $cadir."/req/".$reqname.".pem"; + + } + + if(not -s $reqfile) { + GUI::HELPERS::print_warning(_("Request file not found")); + return; + } + + $main->show_del_confirm($reqfile, 'req'); + + return; +} + +# +# now really delete the requestfile +# +sub del_req { + my ($self, $main, $file) = @_; + + my ($ca, $cadir); + + GUI::HELPERS::set_cursor($main, 1); + + unlink($file); + + $ca = $main->{'reqbrowser'}->selection_caname(); + $cadir = $main->{'reqbrowser'}->selection_cadir(); + + $main->{'reqbrowser'}->update($cadir."/req", + $cadir."/crl/crl.pem", + $cadir."/index.txt", + 0); + + GUI::HELPERS::set_cursor($main, 0); + + return; +} + +sub read_reqlist { + my ($self, $reqdir, $crlfile, $indexfile, $force, $main) = @_; + + my ($f, $modt, $d, $reqlist, $c, $p, $t); + + GUI::HELPERS::set_cursor($main, 1); + + $reqlist = []; + + $modt = (stat($reqdir))[9]; + + if(defined($self->{'lastread'}) && + $self->{'lastread'} >= $modt) { + GUI::HELPERS::set_cursor($main, 0); + return(0); + } + + opendir(DIR, $reqdir) || do { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning(_("Can't open Request directory")); + return(0); + }; + + while($f = readdir(DIR)) { + next if $f =~ /^\./; + $c++; + } + rewinddir(DIR); + + $main->{'barbox'}->pack_start($main->{'progress'}, 0, 0, 0); + $main->{'progress'}->show(); + while($f = readdir(DIR)) { + next if $f =~ /^\./; + $f =~ s/\.pem//; + $d = HELPERS::dec_base64($f); + next if not defined($d); + next if $d eq ""; + push(@{$reqlist}, $d); + + if(defined($main)) { + $t = sprintf(_(" Read Request: %s"), $d); + GUI::HELPERS::set_status($main, $t); + $p += 100/$c; + if($p/100 <= 1) { + $main->{'progress'}->set_fraction($p/100); + while(Gtk2->events_pending) { + Gtk2->main_iteration; + } + } + select(undef, undef, undef, 0.025); + } + } + @{$reqlist} = sort(@{$reqlist}); + closedir(DIR); + + delete($self->{'reqlist'}); + $self->{'reqlist'} = $reqlist; + + $self->{'lastread'} = time(); + + if(defined($main)) { + $main->{'progress'}->set_fraction(0); + $main->{'barbox'}->remove($main->{'progress'}); + GUI::HELPERS::set_cursor($main, 0); + } + + return(1); # got new list +} + +# +# get name of request to sign +# +sub get_sign_req { + my ($self, $main, $opts, $box) = @_; + + my($time, $parsed, $ca, $cadir, $ext, $ret); + + $box->destroy() if(defined($box)); + + $time = time(); + $ca = $main->{'reqbrowser'}->selection_caname(); + $cadir = $main->{'reqbrowser'}->selection_cadir(); + + if(not(defined($opts->{'reqfile'}))) { + $opts->{'req'} = $main->{'reqbrowser'}->selection_dn(); + + if(not defined($opts->{'req'})) { + GUI::HELPERS::print_info(_("Please select a Request first")); + return; + } + + $opts->{'reqname'} = HELPERS::enc_base64($opts->{'req'}); + $opts->{'reqfile'} = $cadir."/req/".$opts->{'reqname'}.".pem"; + } + + if(not -s $opts->{'reqfile'}) { + GUI::HELPERS::print_warning(_("Request file not found")); + return; + } + + if((-s $cadir."/certs/".$opts->{'reqname'}.".pem") && + (!(defined($opts->{'overwrite'})) || ($opts->{'overwrite'} ne 'true'))) { + $main->show_cert_overwrite_confirm($opts); + return; + } + + $parsed = $main->{'CERT'}->parse_cert($main, 'CA'); + + defined($parsed) || + GUI::HELPERS::print_error(_("Can't read CA certificate")); + + if(!defined($opts->{'passwd'})) { + $opts->{'days'} = + $main->{'TCONFIG'}->{$opts->{'type'}."_ca"}->{'default_days'}; + + if($opts->{'days'} > (($parsed->{'EXPDATE'}/86400) - ($time/86400))) { + $opts->{'days'} = int(($parsed->{'EXPDATE'}/86400) - ($time/86400)); + } + + $main->show_req_sign_dialog($opts); + return; + } + + if((($time + ($opts->{'days'} * 86400)) > $parsed->{'EXPDATE'}) && + (!(defined($opts->{'ignoredate'})) || + $opts->{'ignoredate'} ne 'true')){ + $main->show_req_date_warning($opts); + return; + } + + # try to find message digest used for the request + $parsed = undef; + $parsed = $self->parse_req($main, $opts->{'reqname'}, 1); + defined($parsed) || + GUI::HELPERS::print_error(_("Can't read Request file")); + + if(defined($parsed->{'SIG_ALGORITHM'})) { + $opts->{'digest'} = $parsed->{'SIG_ALGORITHM'}; + + if($opts->{'digest'} =~ /^md2/) { + $opts->{'digest'} = "md2"; + } elsif ($opts->{'digest'} =~ /^mdc2/) { + $opts->{'digest'} = "mdc2"; + } elsif ($opts->{'digest'} =~ /^md4/) { + $opts->{'digest'} = "md4"; + } elsif ($opts->{'digest'} =~ /^md5/) { + $opts->{'digest'} = "md5"; + } elsif ($opts->{'digest'} =~ /^sha1/) { + $opts->{'digest'} = "sha1"; + } elsif ($opts->{'digest'} =~ /^ripemd160/) { + $opts->{'digest'} = "ripemd160"; + } else { + } + } else { + $opts->{'digest'} = 0; + } + + ($ret, $ext) = $self->sign_req($main, $opts); + + return($ret, $ext); +} + +# +# now really sign the request +# +sub sign_req { + my ($self, $main, $opts) = @_; + + my($serial, $certout, $certfile, $certfile2, $ca, $cadir, $ret, $t, $ext); + + GUI::HELPERS::set_cursor($main, 1); + + $ca = $main->{'reqbrowser'}->selection_caname(); + $cadir = $main->{'reqbrowser'}->selection_cadir(); + + $serial = $cadir."/serial"; + open(IN, "<$serial") || do { + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning(_("Can't read serial")); + return; + }; + $serial = ; + chomp($serial); + close IN; + + if(not defined($opts->{'nsSslServerName'})) { + $opts->{'nsSslServerName'} = 'none'; + } + if(not defined($opts->{'nsRevocationUrl'})) { + $opts->{'nsRevocationUrl'} = 'none'; + } + if(not defined($opts->{'nsRenewalUrl'})) { + $opts->{'nsRenewalUrl'} = 'none'; + } + if(not defined($opts->{'subjectAltName'})) { + $opts->{'subjectAltName'} = 'none'; + $opts->{'subjectAltNameType'} = 'none'; + } else { + $opts->{'subjectAltNameType'} = + $main->{TCONFIG}->{$opts->{'type'}.'_cert'}->{'subjectAltNameType'}; + } + if(not defined($opts->{'extendedKeyUsage'})) { + $opts->{'extendedKeyUsage'} = 'none'; + $opts->{'extendedKeyUsageType'} = 'none'; + } else { + $opts->{'extendedKeyUsageType'} = + $main->{TCONFIG}->{$opts->{'type'}.'_cert'}->{'extendedKeyUsageType'}; + } + + if(defined($opts->{'mode'}) && $opts->{'mode'} eq "sub") { + ($ret, $ext) = $self->{'OpenSSL'}->signreq( + 'mode' => $opts->{'mode'}, + 'config' => $main->{'CA'}->{$ca}->{'cnf'}, + 'reqfile' => $opts->{'reqfile'}, + 'keyfile' => $opts->{'keyfile'}, + 'cacertfile' => $opts->{'cacertfile'}, + 'outdir' => $opts->{'outdir'}, + 'days' => $opts->{'days'}, + 'parentpw' => $opts->{'parentpw'}, + 'caname' => "ca_ca", + 'revocationurl' => $opts->{'nsRevocationUrl'}, + 'renewalurl' => $opts->{'nsRenewalUrl'}, + 'subjaltname' => $opts->{'subjectAltName'}, + 'subjaltnametype' => $opts->{'subjectAltNameType'}, + 'extendedkeyusage' => $opts->{'extendedKeyUsage'}, + 'extendedkeyusagetype' => $opts->{'extendedKeyUsageType'}, + 'noemaildn' => $opts->{'noemaildn'}, + 'digest' => $opts->{'digest'} + ); + } else { + ($ret, $ext) = $self->{'OpenSSL'}->signreq( + 'config' => $main->{'CA'}->{$ca}->{'cnf'}, + 'reqfile' => $opts->{'reqfile'}, + 'days' => $opts->{'days'}, + 'pass' => $opts->{'passwd'}, + 'caname' => $opts->{'type'}."_ca", + 'sslservername' => $opts->{'nsSslServerName'}, + 'revocationurl' => $opts->{'nsRevocationUrl'}, + 'renewalurl' => $opts->{'nsRenewalUrl'}, + 'subjaltname' => $opts->{'subjectAltName'}, + 'subjaltnametype' => $opts->{'subjectAltNameType'}, + 'extendedkeyusage' => $opts->{'extendedKeyUsage'}, + 'extendedkeyusagetype' => $opts->{'extendedKeyUsageType'}, + 'noemaildn' => $opts->{'noemaildn'}, + 'digest' => $opts->{'digest'} + ); + } + + GUI::HELPERS::set_cursor($main, 0); + + if($ret eq 1) { + $t = _("Wrong CA password given\nSigning of the Request failed"); + GUI::HELPERS::print_warning($t, $ext); + delete($opts->{$_}) foreach(keys(%$opts)); + $opts = undef; + return; + } elsif($ret eq 2) { + $t = _("CA Key not found\nSigning of the Request failed"); + GUI::HELPERS::print_warning($t, $ext); + delete($opts->{$_}) foreach(keys(%$opts)); + $opts = undef; + return; + } elsif($ret eq 3) { + $t = _("Certificate already existing\nSigning of the Request failed"); + GUI::HELPERS::print_warning($t, $ext); + delete($opts->{$_}) foreach(keys(%$opts)); + $opts = undef; + return; + } elsif($ret eq 4) { + $t = _("Invalid IP Address given\nSigning of the Request failed"); + GUI::HELPERS::print_warning($t, $ext); + delete($opts->{$_}) foreach(keys(%$opts)); + $opts = undef; + return; + } elsif($ret) { + GUI::HELPERS::print_warning( + _("Signing of the Request failed"), $ext); + delete($opts->{$_}) foreach(keys(%$opts)); + $opts = undef; + return($ret, $ext); + } + + if(defined($opts->{'mode'}) && $opts->{'mode'} eq "sub") { + $certout = $cadir."/newcerts/".$serial.".pem"; + $certfile = $opts->{'outfile'}; + $certfile2 = $cadir."/certs/".$opts->{'reqname'}.".pem"; + } else { + $certout = $cadir."/newcerts/".$serial.".pem"; + $certfile = $cadir."/certs/".$opts->{'reqname'}.".pem"; + #print STDERR "DEBUG: write certificate to: ".$cadir."/certs/".$opts->{'reqname'}.".pem"; + } + + if (not -s $certout) { + GUI::HELPERS::print_warning( + _("Signing of the Request failed"), $ext); + delete($opts->{$_}) foreach(keys(%$opts)); + $opts = undef; + return; + } + + open(IN, "<$certout") || do { + GUI::HELPERS::print_warning(_("Can't read Certificate file")); + delete($opts->{$_}) foreach(keys(%$opts)); + $opts = undef; + return; + }; + open(OUT, ">$certfile") || do { + GUI::HELPERS::print_warning(_("Can't write Certificate file")); + delete($opts->{$_}) foreach(keys(%$opts)); + $opts = undef; + return; + }; + print OUT while(); + + if(defined($opts->{'mode'}) && $opts->{'mode'} eq "sub") { + close OUT; + open(OUT, ">$certfile2") || do { + GUI::HELPERS::print_warning(_("Can't write Certificate file")); + delete($opts->{$_}) foreach(keys(%$opts)); + $opts = undef; + return; + }; + seek(IN, 0, 0); + print OUT while(); + } + + close IN; close OUT; + + GUI::HELPERS::print_info( + _("Request signed succesfully.\nCertificate created"), $ext); + + GUI::HELPERS::set_cursor($main, 1); + + $main->{'CERT'}->reread_cert($main, + HELPERS::dec_base64($opts->{'reqname'})); + + $main->{'certbrowser'}->update($cadir."/certs", + $cadir."/crl/crl.pem", + $cadir."/index.txt", + 0); + + delete($opts->{$_}) foreach(keys(%$opts)); + $opts = undef; + + GUI::HELPERS::set_cursor($main, 0); + + return($ret, $ext); +} + +# +# get informations/verifications to import request from file +# +sub get_import_req { + my ($self, $main, $opts, $box) = @_; + + my ($ret, $ext, $der); + + $box->destroy() if(defined($box)); + + my($ca, $parsed, $file, $format); + + $ca = $main->{'CA'}->{'actca'}; + + if(not defined($opts)) { + $main->show_req_import_dialog(); + return; + } + + if(not defined($opts->{'infile'})) { + $main->show_req_import_dialog(); + GUI::HELPERS::print_warning(_("Please select a Request file first")); + return; + } + if(not -s $opts->{'infile'}) { + $main->show_req_import_dialog(); + GUI::HELPERS::print_warning( + _("Can't find Request file: ").$opts->{'infile'}); + return; + } + + open(IN, "<$opts->{'infile'}") || do { + GUI::HELPERS::print_warning( + _("Can't read Request file:").$opts->{'infile'}); + return; + }; + + $opts->{'in'} .= $_ while(); + + if($opts->{'in'} =~ /-BEGIN[\s\w]+CERTIFICATE REQUEST-/i) { + $format = "PEM"; + $file = $opts->{'infile'}; + } else { + $format = "DER"; + } + + if($format eq "DER") { + ($ret, $der, $ext) = $opts->{'in'} = $self->{'OpenSSL'}->convdata( + 'cmd' => 'req', + 'data' => $opts->{'in'}, + 'inform' => 'DER', + 'outform' => 'PEM' + ); + + if($ret) { + GUI::HELPERS::print_warning( + _("Error converting Request"), $ext); + return; + } + + $opts->{'tmpfile'} = + HELPERS::mktmp($self->{'OpenSSL'}->{'tmp'}."/import"); + + open(TMP, ">$opts->{'tmpfile'}") || do { + GUI::HELPERS::print_warning( _("Can't create temporary file: %s: %s"), + $opts->{'tmpfile'}, $!); + return; + }; + print TMP $opts->{'in'}; + close(TMP); + $file = $opts->{'tmpfile'}; + } + + $parsed = $self->{'OpenSSL'}->parsereq( + $main->{'CA'}->{$ca}->{'cnf'}, + $file); + + if(not defined($parsed)) { + unlink($opts->{'tmpfile'}); + GUI::HELPERS::print_warning(_("Parsing Request failed")); + return; + } + + $main->show_import_verification("req", $opts, $parsed); + return; +} + +# +# import request +# +sub import_req { + my ($self, $main, $opts, $parsed, $box) = @_; + + my ($ca, $cadir); + + $box->destroy() if(defined($box)); + + GUI::HELPERS::set_cursor($main, 1); + + $ca = $main->{'reqbrowser'}->selection_caname(); + $cadir = $main->{'reqbrowser'}->selection_cadir(); + + $opts->{'name'} = HELPERS::gen_name($parsed); + + $opts->{'reqname'} = HELPERS::enc_base64($opts->{'name'}); + + $opts->{'reqfile'} = $cadir."/req/".$opts->{'reqname'}.".pem"; + + open(OUT, ">$opts->{'reqfile'}") || do { + unlink($opts->{'tmpfile'}); + GUI::HELPERS::set_cursor($main, 0); + GUI::HELPERS::print_warning(_("Can't open output file: %s: %s"), + $opts->{'reqfile'}, $!); + return; + }; + print OUT $opts->{'in'}; + close OUT; + + $main->{'reqbrowser'}->update($cadir."/req", + $cadir."/crl/crl.pem", + $cadir."/index.txt", + 0); + + GUI::HELPERS::set_cursor($main, 0); + + return; +} + +sub parse_req { + my ($self, $main, $name, $force) = @_; + + my ($parsed, $ca, $reqfile, $req); + + GUI::HELPERS::set_cursor($main, 1); + + $ca = $main->{'CA'}->{'actca'}; + + $reqfile = $main->{'CA'}->{$ca}->{'dir'}."/req/".$name.".pem"; + + $parsed = $self->{'OpenSSL'}->parsereq($main->{'CA'}->{$ca}->{'cnf'}, + $reqfile, $force); + + GUI::HELPERS::set_cursor($main, 0); + + return($parsed); +} + +1 + diff --git a/lib/TCONFIG.pm b/lib/TCONFIG.pm new file mode 100644 index 0000000..78d3e2b --- /dev/null +++ b/lib/TCONFIG.pm @@ -0,0 +1,555 @@ +# Copyright (c) Stephan Martin +# +# $Id: TCONFIG.pm,v 1.2 2006/06/28 21:50:42 sm Exp $ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + +use strict; + +package TCONFIG; + +use POSIX; + +sub new { + my $self = {}; + my $that = shift; + my $class = ref($that) || $that; + + bless($self, $class); +} + +sub init_config { + my ($self, $main, $ca) = @_; + + my($file, @lines, $i, $section, $l, $k, $v); + + if(not defined($ca)) { + $ca = $main->{'CA'}->{'actca'}; + } + if(not defined($ca)) { + GUI::HELPERS::print_warning(_("Please select a CA first")); + return; + } + + $file = $main->{'CA'}->{$ca}->{'cnf'}; + + open(IN, "<$file") || do { + GUI::HELPERS::print_warning(_("Can't open configuration")); + return; + }; + + @lines = ; + close IN; + chomp(@lines); + + # clean old configuration + foreach $k (keys(%$self)) { + delete($self->{$k}); + } + + foreach $l (@lines) { + next if $l =~ /^#/; + next if $l =~ /^$/; + next if $l =~ /^ *$/; + + # find section + if($l =~ /\[\s*([^\s]+)\s*\]/) { + $section = $1; + } elsif ($l =~ /^([^\s\t]+)[\s\t]*=[\s\t]*([^\s\t]+.*)$/) { + if($section eq "ca" || + $section eq "policy_client" || + $section eq "policy_server" || + $section eq "policy_ca" || + $section eq "req" || + $section eq "req_distinguished_name" || + $section eq "v3_req" || + $section eq "req_attributes") { + if(not defined($self->{$section})) { + $self->{$section} = []; + } + push(@{$self->{$section}}, $l); + } else { + $k = $1; + $v = $2; + # really ugly hack XXX + if($v =~ /ENV::(\w+)$/) { + $ENV{$1} = 'dummy'; + } + if(not defined($self->{$section})) { + $self->{$section} = {}; + } + $self->{$section}->{$k} = $v; + } + } + } + + # store nsSslServerName information + if(defined($self->{'server_cert'}->{'nsSslServerName'})) { + if($self->{'server_cert'}->{'nsSslServerName'} + =~ /ENV:/) { + $self->{'server_cert'}->{'nsSslServerName'} = 'user'; + } + }else { + $self->{'server_cert'}->{'nsSslServerName'} = 'none'; + } + + # store subjectAltName information + # ca + if(defined($self->{'v3_ca'}->{'subjectAltName'})) { + if($self->{'v3_ca'}->{'subjectAltName'} eq 'email:copy') { + $self->{'v3_ca'}->{'subjectAltName'} = 'emailcopy'; + } + }else { + $self->{'v3_ca'}->{'subjectAltName'} = 'none'; + } + + # server + if(defined($self->{'server_cert'}->{'subjectAltName'})) { + if($self->{'server_cert'}->{'subjectAltName'} + =~ /ENV:.*IP/) { + $self->{'server_cert'}->{'subjectAltNameType'} = 'ip'; + $self->{'server_cert'}->{'subjectAltName'} = 'user'; + }elsif($self->{'server_cert'}->{'subjectAltName'} + =~ /ENV:.*DNS/) { + $self->{'server_cert'}->{'subjectAltNameType'} = 'dns'; + $self->{'server_cert'}->{'subjectAltName'} = 'user'; + }elsif($self->{'server_cert'}->{'subjectAltName'} + =~ /ENV:.*RAW/) { + $self->{'server_cert'}->{'subjectAltNameType'} = 'raw'; + $self->{'server_cert'}->{'subjectAltName'} = 'user'; + }elsif($self->{'server_cert'}->{'subjectAltName'} + eq 'email:copy') { + $self->{'server_cert'}->{'subjectAltName'} = 'emailcopy'; + $self->{'server_cert'}->{'subjectAltNameType'} = 'ip'; + } + }else { + $self->{'server_cert'}->{'subjectAltNameType'} = 'ip'; + $self->{'server_cert'}->{'subjectAltName'} = 'none'; + } + + # client + if(defined($self->{'client_cert'}->{'subjectAltName'})) { + if($self->{'client_cert'}->{'subjectAltName'} + =~ /ENV:.*IP/) { + $self->{'client_cert'}->{'subjectAltNameType'} = 'ip'; + $self->{'client_cert'}->{'subjectAltName'} = 'user'; + }elsif($self->{'client_cert'}->{'subjectAltName'} + =~ /ENV:.*DNS/) { + $self->{'client_cert'}->{'subjectAltNameType'} = 'dns'; + $self->{'client_cert'}->{'subjectAltName'} = 'user'; + }elsif($self->{'client_cert'}->{'subjectAltName'} + =~ /ENV:.*EMAIL/) { + $self->{'client_cert'}->{'subjectAltNameType'} = 'mail'; + $self->{'client_cert'}->{'subjectAltName'} = 'user'; + }elsif($self->{'client_cert'}->{'subjectAltName'} + =~ /ENV:.*RAW/) { + $self->{'client_cert'}->{'subjectAltNameType'} = 'raw'; + $self->{'client_cert'}->{'subjectAltName'} = 'user'; + }elsif($self->{'client_cert'}->{'subjectAltName'} + eq 'email:copy') { + $self->{'client_cert'}->{'subjectAltName'} = 'emailcopy'; + $self->{'client_cert'}->{'subjectAltNameType'} = 'ip'; + } + }else { + $self->{'client_cert'}->{'subjectAltNameType'} = 'ip'; + $self->{'client_cert'}->{'subjectAltName'} = 'none'; + } + + foreach my $sect ('server_cert', 'client_cert', 'v3_ca') { + # store nsRevocationUrl information + if(defined($self->{$sect}->{'nsRevocationUrl'})) { + if($self->{$sect}->{'nsRevocationUrl'} + =~ /ENV:/) { + $self->{$sect}->{'nsRevocationUrl'} = 'user'; + } + }else { + $self->{$sect}->{'nsRevocationUrl'} = 'none'; + } + + # store nsRenewalUrl information + if(defined($self->{$sect}->{'nsRenewalUrl'})) { + if($self->{$sect}->{'nsRenewalUrl'} + =~ /ENV:/) { + $self->{$sect}->{'nsRenewalUrl'} = 'user'; + } + }else { + $self->{$sect}->{'nsRenewalUrl'} = 'none'; + } + + # store extendedKeyUsage information + if(defined($self->{$sect}->{'extendedKeyUsage'})) { + if($self->{$sect}->{'extendedKeyUsage'} =~ /critical/) { + $self->{$sect}->{'extendedKeyUsageType'} = 'critical'; + $self->{$sect}->{'extendedKeyUsage'} =~ s/critical\s*,\s*//; + }else { + $self->{$sect}->{'extendedKeyUsageType'} = 'noncritical'; + } + if($self->{$sect}->{'extendedKeyUsage'} + =~ /ENV:/) { + $self->{$sect}->{'extendedKeyUsage'} = 'user'; + } + }else { + $self->{$sect}->{'extendedKeyUsage'} = 'none'; + $self->{$sect}->{'extendedKeyUsageType'} = 'noncritical'; + } + + # store keyUsage information + if(defined($self->{$sect}->{'keyUsage'})) { + if($self->{$sect}->{'keyUsage'} =~ /critical/) { + $self->{$sect}->{'keyUsageType'} = 'critical'; + }else { + $self->{$sect}->{'keyUsageType'} = 'noncritical'; + } + if($self->{$sect}->{'keyUsage'} + =~ /digitalSignature, keyEncipherment/) { + $self->{$sect}->{'keyUsage'} = 'keysig'; + } elsif($self->{$sect}->{'keyUsage'} + =~ /digitalSignature/) { + $self->{$sect}->{'keyUsage'} = 'sig'; + } elsif($self->{$sect}->{'keyUsage'} + =~ /keyEncipherment/) { + $self->{$sect}->{'keyUsage'} = 'key'; + } elsif($self->{$sect}->{'keyUsage'} + =~ /keyCertSign, cRLSign/) { + $self->{$sect}->{'keyUsage'} = 'keyCertSign, cRLSign'; + } elsif($self->{$sect}->{'keyUsage'} + =~ /keyCertSign/) { + $self->{$sect}->{'keyUsage'} = 'keyCertSign'; + } elsif($self->{$sect}->{'keyUsage'} + =~ /cRLSign/) { + $self->{$sect}->{'keyUsage'} = 'cRLSign'; + }else { + $self->{$sect}->{'keyUsage'} = 'none'; + } + }else { + $self->{$sect}->{'keyUsage'} = 'none'; + $self->{$sect}->{'keyUsageType'} = 'noncritical'; + } + } + + # hack to add new section to openssl.cnf, if old config + if(not defined($self->{'ca_ca'})) { + $self->{'ca_ca'} = $self->{'server_ca'}; + $self->{'ca_ca'}->{'x509_extensions'} = "v3_ca"; + $self->{'server_ca'}->{'x509_extensions'} = "server_cert"; + + $self->write_config($main, $ca); + } + if($self->{'server_ca'}->{'x509_extensions'} eq "v3_ca") { + $self->{'server_ca'}->{'x509_extensions'} = "server_cert"; + $self->write_config($main, $ca); + } + + # hack to add new option + if(not defined($self->{'ca_ca'}->{'unique_subject'})) { + $self->{'ca_ca'}->{'unique_subject'} = "yes"; + + $self->write_config($main, $ca); + } + if(not defined($self->{'server_ca'}->{'unique_subject'})) { + $self->{'server_ca'}->{'unique_subject'} = "yes"; + + $self->write_config($main, $ca); + } + if(not defined($self->{'client_ca'}->{'unique_subject'})) { + $self->{'client_ca'}->{'unique_subject'} = "yes"; + + $self->write_config($main, $ca); + } + + return; +} + +sub config_ca { + my ($self, $main, $ca) = @_; + + my($action); + + if(not defined($ca)) { + $ca = $main->{'CA'}->{'actca'}; + } + if(not defined($ca)) { + GUI::HELPERS::print_warning(_("Can't get CA name")); + } + + $action = GUI::TCONFIG::show_config_ca($main, $ca); + + return; +} + +sub config_openssl { + my ($self, $main, $ca) = @_; + + if(not defined($ca)) { + $ca = $main->{'CA'}->{'actca'}; + } + if(not defined($ca)) { + GUI::HELPERS::print_warning(_("Can't get CA name")); + } + + GUI::TCONFIG::show_configbox($main, $ca); + + return; +} + +sub write_config { + my ($self, $main, $ca) = @_; + + my($file, @sections, $line, $sect, $key, $val, @opts); + + # these sections are not configurable + @sections = qw( + ca + policy_client + policy_server + policy_ca + req + req_distinguished_name + v3_req + req_attributes + ); + + $file = $main->{'CA'}->{$ca}->{'cnf'}; + + open(OUT, ">$file") || do { + GUI::HELPERS::print_warning(_("Can't open configfile")); + return; + }; + + foreach $sect (@sections) { + print OUT "[ $sect ]\n"; + foreach $line (@{$self->{$sect}}) { + print OUT "$line\n"; + } + print OUT "\n"; + } + + # these sections are configurable + @sections = qw( + v3_ca + crl_ext + server_ca + client_ca + ca_ca + client_cert + server_cert + ); + + foreach $sect (@sections) { + print OUT "[ $sect ]\n"; + if($sect eq "v3_ca") { + @opts = qw( + subjectKeyIdentifier + authorityKeyIdentifier + basicConstraints + nsCertType + issuerAltName + nsComment + crlDistributionPoints + nsCaRevocationUrl + nsCaPolicyUrl + nsRevocationUrl + nsRenewalUrl + ); + + foreach $key (@opts) { + if(defined($self->{$sect}->{$key}) && + $self->{$sect}->{$key} ne '' && + $self->{$sect}->{$key} ne 'none') { + print OUT "$key = $self->{$sect}->{$key}\n"; + } + } + if(defined($self->{$sect}->{'subjectAltName'})) { + if($self->{$sect}->{'subjectAltName'} eq 'emailcopy') { + print OUT "subjectAltName = email:copy\n"; + } elsif($self->{$sect}->{'subjectAltName'} eq 'none') { + ;# do nothing + } + } + if(defined($self->{$sect}->{'keyUsage'})) { + if($self->{$sect}->{'keyUsage'} eq 'keyCertSign') { + if($self->{$sect}->{'keyUsageType'} eq 'critical') { + print OUT "keyUsage = critical, keyCertSign\n"; + } else { + print OUT "keyUsage = keyCertSign\n"; + } + }elsif($self->{$sect}->{'keyUsage'} eq 'cRLSign') { + if($self->{$sect}->{'keyUsageType'} eq 'critical') { + print OUT "keyUsage = critical, cRLSign\n"; + }else { + print OUT "keyUsage = cRLSign\n"; + } + }elsif($self->{$sect}->{'keyUsage'} eq 'keyCertSign, cRLSign') { + if($self->{$sect}->{'keyUsageType'} eq 'critical') { + print OUT "keyUsage = critical, keyCertSign, cRLSign\n"; + }else { + print OUT "keyUsage = keyCertSign, cRLSign\n"; + } + }elsif($self->{$sect}->{'keyUsage'} eq 'none') { + ;# do nothing + } + } + } elsif($sect eq "server_cert" || + $sect eq "client_cert") { + @opts = qw( + basicConstraints + nsCertType + nsComment + subjectKeyIdentifier + authorityKeyIdentifier + issuerAltName + crlDistributionPoints + nsCaRevocationUrl + nsBaseUrl + nsCaPolicyUrl + ); + + foreach $key (@opts) { + if(defined($self->{$sect}->{$key}) && + $self->{$sect}->{$key} ne '' && + $self->{$sect}->{$key} ne 'none') { + print OUT "$key = $self->{$sect}->{$key}\n"; + } + } + if(defined($self->{$sect}->{'nsSslServerName'})) { + if($self->{$sect}->{'nsSslServerName'} eq 'user') { + print OUT "nsSslServerName = \$ENV::NSSSLSERVERNAME\n"; + } elsif($self->{$sect}->{'nsSslServerName'} eq 'none') { + ;# do nothing + } + } + if(defined($self->{$sect}->{'nsRevocationUrl'})) { + if($self->{$sect}->{'nsRevocationUrl'} eq 'user') { + print OUT "nsRevocationUrl = \$ENV::NSREVOCATIONURL\n"; + } elsif($self->{$sect}->{'nsRevocationUrl'} eq 'none') { + ;# do nothing + } + } + if(defined($self->{$sect}->{'nsRenewalUrl'})) { + if($self->{$sect}->{'nsRenewalUrl'} eq 'user') { + print OUT "nsRenewalUrl = \$ENV::NSRENEWALURL\n"; + } elsif($self->{$sect}->{'nsRenewalUrl'} eq 'none') { + ;# do nothing + } + } + if(defined($self->{$sect}->{'subjectAltName'})) { + if($self->{$sect}->{'subjectAltName'} eq 'user') { + if($self->{$sect}->{'subjectAltNameType'} eq 'ip') { + print OUT "subjectAltName = \$ENV::SUBJECTALTNAMEIP\n"; + } elsif($self->{$sect}->{'subjectAltNameType'} eq 'dns') { + print OUT "subjectAltName = \$ENV::SUBJECTALTNAMEDNS\n"; + } elsif($self->{$sect}->{'subjectAltNameType'} eq 'mail') { + print OUT "subjectAltName = \$ENV::SUBJECTALTNAMEEMAIL\n"; + } elsif($self->{$sect}->{'subjectAltNameType'} eq 'raw') { + print OUT "subjectAltName = \$ENV::SUBJECTALTNAMERAW\n"; + } + } elsif($self->{$sect}->{'subjectAltName'} eq 'emailcopy') { + print OUT "subjectAltName = email:copy\n"; + } elsif($self->{$sect}->{'subjectAltName'} eq 'none') { + ;# do nothing + } + } + if(defined($self->{$sect}->{'keyUsage'})) { + if($self->{$sect}->{'keyUsage'} eq 'key') { + if($self->{$sect}->{'keyUsageType'} eq 'critical') { + print OUT "keyUsage = critical, keyEncipherment\n"; + } else { + print OUT "keyUsage = keyEncipherment\n"; + } + }elsif($self->{$sect}->{'keyUsage'} eq 'sig') { + if($self->{$sect}->{'keyUsageType'} eq 'critical') { + print OUT "keyUsage = critical, digitalSignature\n"; + }else { + print OUT "keyUsage = digitalSignature\n"; + } + }elsif($self->{$sect}->{'keyUsage'} eq 'keysig') { + if($self->{$sect}->{'keyUsageType'} eq 'critical') { + print OUT "keyUsage = critical, digitalSignature, keyEncipherment\n"; + }else { + print OUT "keyUsage = digitalSignature, keyEncipherment\n"; + } + }elsif($self->{$sect}->{'keyUsage'} eq 'none') { + ;# do nothing + } + } + if(defined($self->{$sect}->{'extendedKeyUsage'})) { + if(($self->{$sect}->{'extendedKeyUsage'} ne 'none') && + ($self->{$sect}->{'extendedKeyUsage'} ne '')) { + if($self->{$sect}->{'extendedKeyUsage'} eq 'user') { + if($self->{$sect}->{'extendedKeyUsageType'} eq 'critical') { + print OUT "extendedKeyUsage = critical, \$ENV::EXTENDEDKEYUSAGE\n"; + } else { + print OUT "extendedKeyUsage = \$ENV::EXTENDEDKEYUSAGE\n"; + } + } else { + if($self->{$sect}->{'extendedKeyUsageType'} eq 'critical') { + print OUT "extendedKeyUsage = critical, $self->{$sect}->{'extendedKeyUsage'}\n"; + } else { + print OUT "extendedKeyUsage = $self->{$sect}->{'extendedKeyUsage'}\n"; + } + } + } elsif ($self->{$sect}->{'extendedKeyUsage'} eq 'none') { + ;# do nothing + } + } + } elsif(($sect eq "server_ca") || + ($sect eq "client_ca") || + ($sect eq "ca_ca")) { + @opts = qw( + dir + certs + crl_dir + database + new_certs_dir + certificate + serial + crl + private_key + RANDFILE + x509_extensions + default_days + default_crl_days + default_md + preserve + policy + unique_subject + ); + + foreach $key (@opts) { + if(defined($self->{$sect}->{$key}) && + $self->{$sect}->{$key} ne '' && + $self->{$sect}->{$key} ne 'none') { + print OUT "$key = $self->{$sect}->{$key}\n"; + } + } + } else { + while(($key, $val) = each(%{$self->{$sect}})) { + if(defined($val) && $val ne "") { + print OUT "$key = $val\n"; + } + } + } + print OUT "\n"; + } + + close OUT; + +# print STDERR "DEBUG: wrote config and reinit\n"; +# $self->init_config($main, $ca); + + return; +} + +1 diff --git a/po/Makefile b/po/Makefile new file mode 100644 index 0000000..1a0e659 --- /dev/null +++ b/po/Makefile @@ -0,0 +1,25 @@ +POTFILES=$(wildcard ../lib/*.pm) $(wildcard ../lib/GUI/*.pm) ../tinyca2 +CATALOGS=de.mo es.mo cs.mo fr.mo sv.mo + +all: $(CATALOGS) + +.po.mo: + msgfmt -o $@ $< + install -m 644 $@ ../locale/`basename $@ .mo`/LC_MESSAGES/tinyca2.mo + +%.po: tinyca2.pot + msgmerge -vU $@ tinyca2.pot + +tinyca2.pot: $(POTFILES) + xgettext --add-comments \ + --keyword=_ \ + --keyword=N_ \ + --language=C \ + -o tinyca2.pot \ + $(POTFILES); \ + +clean: + rm -f $(CATALOGS) + rm -f tinyca2.pot + +.SUFFIXES: .po .pot .mo diff --git a/po/cs.po b/po/cs.po new file mode 100644 index 0000000..b8f03c4 --- /dev/null +++ b/po/cs.po @@ -0,0 +1,2003 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: cs\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-07-13 23:47+0200\n" +"PO-Revision-Date: 2004-11-22 19:55+0200\n" +"Last-Translator: Robert Wolf \n" +"Language-Team: czech\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../lib/CA.pm:44 +msgid "error: can't open basedir: " +msgstr "chyba: nelze otevřít hlavní adresář: " + +#: ../lib/CA.pm:102 +msgid " Opening CA: " +msgstr " Otevírání CA: " + +#: ../lib/CA.pm:109 ../lib/CA.pm:270 +msgid "Invalid CA selected" +msgstr "Zvolena neplatná CA" + +#: ../lib/CA.pm:154 +msgid " Initializing OpenSSL" +msgstr " Inicializace OpenSSL" + +#: ../lib/CA.pm:160 +msgid " Check for CA Version" +msgstr " Zjišťování verze CA" + +#: ../lib/CA.pm:167 ../lib/CA.pm:195 +msgid "Can't open index file: " +msgstr "Nelze otevřít indexový soubor: " + +#: ../lib/CA.pm:182 +msgid " Convert CA" +msgstr " Převádím CA" + +#: ../lib/CA.pm:201 +msgid "Can't open index backup: " +msgstr "Nelze otevřít zálohu indexů: " + +#: ../lib/CA.pm:218 +msgid "This CA is converted for openssl 0.9.7x now." +msgstr "Tato CA je nyní zkonvertována pro openssl 0.9.7x" + +#: ../lib/CA.pm:220 +msgid "You will find a backup copy of the index file at: " +msgstr "Záložní kopii indexového souboru najdete zde: " + +#: ../lib/CA.pm:229 +msgid " Read Configuration" +msgstr " Čtení konfigurace" + +#: ../lib/CA.pm:235 +msgid " Create GUI" +msgstr " Vytváření GUI" + +#: ../lib/CA.pm:241 +msgid " Create Toolbar" +msgstr " Vytváření panelu nástrojů" + +#: ../lib/CA.pm:247 +msgid " Actual CA: " +msgstr " Aktuální CA: " + +#: ../lib/CA.pm:332 +#, c-format +msgid "CA: %s deleted" +msgstr "CA: odstraněno %s" + +#: ../lib/CA.pm:386 +msgid "Password of parent CA is needed for creating a Sub CA" +msgstr "Heslo nadřízené CA je nutné pro vytvoření podřízené CA" + +#: ../lib/CA.pm:395 +msgid "Name must be filled in and must" +msgstr "Jméno musí být zadáno a nesmí" + +#: ../lib/CA.pm:396 +msgid " not contain Spaces" +msgstr " obsahovat mezery" + +#: ../lib/CA.pm:408 +msgid "Please specify at least Common Name, " +msgstr "Prosím, zadejte alespoň Obecné jméno, " + +#: ../lib/CA.pm:409 +msgid "Country and Password" +msgstr "Stát a Heslo" + +#: ../lib/CA.pm:416 ../lib/REQ.pm:109 +msgid "Passwords don't match" +msgstr "Hesla nesouhlasí" + +#: ../lib/CA.pm:424 ../lib/REQ.pm:120 +msgid "Country must be exact 2 letter code" +msgstr "Stát musí obsahovat přesně 2 znaky" + +#: ../lib/CA.pm:428 +#, c-format +msgid "CA: %s already exists" +msgstr "CA: %s již existuje" + +#: ../lib/CA.pm:468 +msgid "Name for storage must be filled in and must not contain spaces" +msgstr "Jméno pro úložiště musí být zadáno a nesmí obsahovat mezery" + +#: ../lib/CA.pm:477 +msgid "You didn't give a password for the private CA key." +msgstr "Nezadal jste heslo pro soukromý klíč CA." + +#: ../lib/CA.pm:479 +msgid "The import will fail, if the key is encrypted." +msgstr "Import neproběhne, pokud je klíč zašifrován." + +#: ../lib/CA.pm:488 +msgid "Please give a new password for the CA" +msgstr "Prosím, zadejte nové heslo pro CA" + +#: ../lib/CA.pm:495 +msgid "New passwords don't match" +msgstr "Nová Hesla nesouhlasí" + +#: ../lib/CA.pm:503 +msgid "Please give a CA certificate to import" +msgstr "Prosím, zvolte CA certifikát pro import" + +#: ../lib/CA.pm:508 +#, c-format +msgid "" +"Can't read CA certificate file:\n" +"%s" +msgstr "" +"Nelze číst soubor certifikátu CA:\n" +"%s" + +#: ../lib/CA.pm:518 +msgid "Please give a CA keyfile to import" +msgstr "Prosím, zvolte soubor s klíčem CA pro import" + +#: ../lib/CA.pm:523 +#, c-format +msgid "" +"Can't read CA key file:\n" +"%s" +msgstr "" +"Nelze číst soubor s klíčem CA:\n" +"%s" + +#: ../lib/CA.pm:535 +msgid "Please give an Index file to import.\n" +msgstr "Prosím, zvolte indexový soubor pro import.\n" + +#: ../lib/CA.pm:536 +msgid "If you don't have an Index file, i'll try to generate one.\n" +msgstr "Pokud nemáte indexový soubor, pokusím se jej vygenerovat.\n" + +#: ../lib/CA.pm:537 +msgid "Attention: This will cause all Certificates to show up as valid.\n" +msgstr "" +"Pozor: Toto způsobí, že budou všechny certifikáty zobrazovány jako platné.\n" + +#: ../lib/CA.pm:538 +msgid "Attention: Revoked Certificates will not be determined." +msgstr "Pozor: Odvolané certifikáty nebudou zohledněny." + +#: ../lib/CA.pm:549 +#, c-format +msgid "" +"Can't read Index file:\n" +"%s" +msgstr "" +"Nelze číst indexový soubor:\n" +"%s" + +#: ../lib/CA.pm:562 +msgid "Please give a directory containing the certificates to import" +msgstr "Prosím, zvolte adresář, který obsahuje certifikáty pro import" + +#: ../lib/CA.pm:567 +#, c-format +msgid "" +"Can't find certificate directory:\n" +"%s" +msgstr "" +"Nelze najít adresář s certifikáty:\n" +"%s" + +#: ../lib/CA.pm:578 +#, c-format +msgid "CA: %s already exists. Please choose another name" +msgstr "CA: %s již existuje. Prosím, zvolte jiné jméno" + +#: ../lib/CA.pm:594 +msgid "Can't find X509v3 Basic Constraints in CA Certificate\n" +msgstr "" +"Nelze najít X509v3 základní omezení (Basic Constraints) v certifikátu CA\n" + +#: ../lib/CA.pm:595 +msgid "Import canceled" +msgstr "Import zrušen" + +#: ../lib/CA.pm:601 +msgid "The selected CA Certificate is no valid CA certificate\n" +msgstr "Vybraný certifikát CA není platný certifikát CA\n" + +#: ../lib/CA.pm:602 +#, c-format +msgid "X509v3 Basic Constraint is set to: %s" +msgstr "X509v3 základní omezení (Basic Constraint) je nastaveno na: %s" + +#: ../lib/CA.pm:612 +#, c-format +msgid "" +"Can't open Index file:\n" +"%s" +msgstr "" +"Nelze otevřít indexový soubor:\n" +"%s" + +#: ../lib/CA.pm:665 ../lib/CERT.pm:61 +#, c-format +msgid "Can't open Certificate directory: %s" +msgstr "Nelze otevřít adresář s certifikáty: %s" + +#: ../lib/CA.pm:684 ../lib/CERT.pm:84 +#, c-format +msgid " Read Certificate: %s" +msgstr " Čtení certifikátu: %s" + +#: ../lib/CA.pm:694 +#, c-format +msgid "Can't read Certificate file: %s" +msgstr "Nelze číst soubor certifikátu: %s" + +#: ../lib/CA.pm:718 +#, c-format +msgid "Can't write Certificate file: %s" +msgstr "Nelze zapsat soubor certifikátu: %s" + +#: ../lib/CA.pm:768 ../lib/CA.pm:927 +msgid "Can't open Index file: " +msgstr "Nelze otevřít indexový soubor: " + +#: ../lib/CA.pm:780 +#, c-format +msgid "Can't write CA Certificate file: %s" +msgstr "Nelze zapsat soubor certifikátu CA: %s" + +#: ../lib/CA.pm:800 ../lib/CA.pm:934 +msgid "Can't write Serial file: " +msgstr "Nelze zapsat soubor serial: " + +#: ../lib/CA.pm:814 +#, c-format +msgid "Can't write CA Key file: %s" +msgstr "Nelze zapsat soubor s klíčem CA: %s" + +#: ../lib/CA.pm:831 ../lib/CA.pm:1155 +msgid "Generating CRL failed" +msgstr "Selhalo vytváření CRL" + +#: ../lib/CA.pm:844 +#, c-format +msgid "Succesfully imported %d certificates\n" +msgstr "Úspěšně bylo importováno %d certifikátů\n" + +#: ../lib/CA.pm:845 +msgid "Check the configuration of your imported CA." +msgstr "Zkontrolujte nastavení Vaší naimportované CA." + +#: ../lib/CA.pm:862 ../lib/CA.pm:971 +msgid "No CA name given" +msgstr "Nebylo zadáno jméno CA" + +#: ../lib/CA.pm:871 ../lib/CA.pm:876 ../lib/CA.pm:881 ../lib/CA.pm:886 +#: ../lib/CA.pm:891 ../lib/CA.pm:896 +msgid "Can't create directory: " +msgstr "Nelze vytvořit adresář: " + +#: ../lib/CA.pm:905 +#, c-format +msgid "Can't open template file %s %s" +msgstr "Nelze otevřít soubor šablony %s %s" + +#: ../lib/CA.pm:910 ../lib/CA.pm:1207 ../lib/CA.pm:1274 ../lib/CERT.pm:637 +#: ../lib/KEY.pm:227 ../lib/REQ.pm:740 +#, c-format +msgid "Can't open output file: %s: %s" +msgstr "Nelze otevřít výstupní soubor: %s: %s" + +#: ../lib/CA.pm:984 ../lib/KEY.pm:482 ../lib/REQ.pm:167 +msgid "Generating key failed" +msgstr "Selhalo vytváření klíče" + +#: ../lib/CA.pm:1018 ../lib/REQ.pm:193 +msgid "Generating Request failed" +msgstr "Selhalo vytváření požadavku-Request" + +#: ../lib/CA.pm:1027 ../lib/CA.pm:1041 ../lib/CERT.pm:102 +msgid "Can't read Certificate" +msgstr "Nelze číst certifikát" + +#: ../lib/CA.pm:1032 ../lib/CA.pm:1046 +msgid "Can't write Certificate" +msgstr "Nelze zapsat certifikát" + +#: ../lib/CA.pm:1086 +msgid "Generating certificate failed" +msgstr "Selhalo vytváření certifikátu" + +#: ../lib/CA.pm:1106 ../lib/CA.pm:1131 +#, c-format +msgid "Can't open ca certificate file %s %s" +msgstr "Nelze otevřít soubor CA certifikátu %s %s" + +#: ../lib/CA.pm:1115 +#, c-format +msgid "Can't create certificate chain file: %s: %s" +msgstr "Nelze vytvořit soubor řetězu certifikátů (certificate chain): %s: %s" + +#: ../lib/CA.pm:1164 +#, c-format +msgid "CA: %s created" +msgstr "CA: vytvořeno %s" + +#: ../lib/CA.pm:1199 +#, c-format +msgid "Can't open certificate chain file: %s: %s" +msgstr "Nelze otevřít soubor řetězu certifikátů (certificate chain): %s: %s" + +#: ../lib/CA.pm:1220 +#, c-format +msgid "Certificate Chain succesfully exported to: %s" +msgstr "Řetěz certifikátů (Certificate chain) úspěšně exportován do: %s" + +#: ../lib/CA.pm:1255 ../lib/CERT.pm:580 ../lib/GUI.pm:166 ../lib/KEY.pm:348 +#: ../lib/REQ.pm:71 ../lib/REQ.pm:389 +msgid "Can't read CA certificate" +msgstr "Nelze číst certifikát CA" + +#: ../lib/CA.pm:1265 +#, c-format +msgid "Invalid Format for export_ca_cert(): %s" +msgstr "Neplatný formát pro export_ca_cert(): %s" + +#: ../lib/CA.pm:1287 +#, c-format +msgid "Certificate succesfully exported to: %s" +msgstr "Certifikát úspěšně exportován do: %s" + +#: ../lib/CA.pm:1320 +msgid "Please give the output file" +msgstr "Zadejte prosím jméno výstupního souboru" + +#: ../lib/CA.pm:1328 +msgid "Please give the CA password to create the Revocation List" +msgstr "" +"Zadejte prosím heslo CA pro vytvoření seznamu odvolaných certifikátů (CRL)" + +#: ../lib/CA.pm:1349 +msgid "" +"Wrong CA password given\n" +"Generating Revocation List failed" +msgstr "" +"Zadáno nesprávné heslo CA\n" +"Vytváření seznamu odvolaných certifikátů (CRL) selhalo" + +#: ../lib/CA.pm:1353 +msgid "" +"CA Key not found\n" +"Generating Revocation List failed" +msgstr "" +"Klíč CA nebyl nalezen\n" +"Vytváření seznamu odvolaných certifikátů (CRL) selhalo" + +#: ../lib/CA.pm:1357 ../lib/CA.pm:1363 +msgid "Generating Revocation List failed" +msgstr "Vytváření seznamu odvolaných certifikátů (CRL) selhalo" + +#: ../lib/CA.pm:1371 +#, c-format +msgid "CRL successfully exported to: %s" +msgstr "CRL úspěšně exportován do: %s" + +#: ../lib/CERT.pm:143 ../lib/CERT.pm:199 ../lib/CERT.pm:322 ../lib/CERT.pm:381 +#: ../lib/GUI.pm:851 +msgid "Please select a Certificate first" +msgstr "Prosím, nejdříve zvolte certifikát" + +#: ../lib/CERT.pm:151 ../lib/CERT.pm:209 ../lib/CERT.pm:333 ../lib/CERT.pm:400 +#: ../lib/GUI.pm:2706 ../lib/GUI.pm:2717 ../lib/OpenSSL.pm:702 +#: ../lib/GUI/X509_browser.pm:276 +msgid "VALID" +msgstr "PLATNÝ" + +#: ../lib/CERT.pm:153 +#, c-format +msgid "" +"Can't renew Certifikate with Status: %s\n" +"Please revoke the Certificate first" +msgstr "" +"Nelze obnovit certifikát s výsledkem: %s\n" +"Prosím, nejdříve certifikát odvolejte" + +#: ../lib/CERT.pm:168 +msgid "" +"Key and Request are necessary for renewal of a Certificate\n" +"Renewal is not possible!" +msgstr "" +"K obnovení certifikátu je nutný klíč a žádost (Request)\n" +"Obnovení není možné!" + +#: ../lib/CERT.pm:210 +#, c-format +msgid "Can't revoke Certifikate with Status: %s" +msgstr "Nelze odvolat certifikát s výsledkem: %s" + +#: ../lib/CERT.pm:256 +msgid "" +"Wrong CA password given\n" +"Revoking the Certificate failed" +msgstr "" +"Zadáno neplatné heslo CA\n" +"Odvolání certifikátu selhalo" + +#: ../lib/CERT.pm:263 +msgid "" +"CA Key not found\n" +"Revoking the Certificate failed" +msgstr "" +"Klíč CA nenalezen\n" +"Odvolání certifikátu selhalo" + +#: ../lib/CERT.pm:270 +msgid "Revoking the Certificate failed" +msgstr "Odvolání certifikátu selhalo" + +#: ../lib/CERT.pm:290 +msgid "Generating a new Revocation List failed" +msgstr "Vytvoření nového seznamu zneplatněných certifikátů (CRL) selhalo" + +#: ../lib/CERT.pm:335 +msgid "" +"Can't delete VALID certificate!\n" +"Please revoke the Certificate first." +msgstr "" +"Nelze odstranit PLATNÝ certifikát!\n" +"Prosím, nejdříve certifikát zneplatněte." + +#: ../lib/CERT.pm:401 +msgid "Certificate seems not to be VALID" +msgstr "Certifikát zřejmě není PLATNÝ" + +#: ../lib/CERT.pm:403 +msgid "Export is not possible" +msgstr "Export není možný" + +#: ../lib/CERT.pm:430 ../lib/KEY.pm:172 +msgid "Please give at least the output file" +msgstr "Prosím, zadejte alespoň výstupní soubor" + +#: ../lib/CERT.pm:436 +msgid "Key is necessary for export as PKCS#12" +msgstr "Klíč je nutný pro export jako PKCS#12" + +#: ../lib/CERT.pm:438 ../lib/CERT.pm:454 ../lib/KEY.pm:257 ../lib/KEY.pm:308 +msgid "Export is not possible!" +msgstr "Export není možný!" + +#: ../lib/CERT.pm:452 +#, fuzzy, c-format +msgid "Key is necessary for export as %s" +msgstr "Klíč je nutný pro export jako %s" + +#: ../lib/CERT.pm:492 ../lib/KEY.pm:216 +#, fuzzy, c-format +msgid "Can't open Certificate file: %s: %s" +msgstr "Nelze otevřít soubor CA certifikátu %s %s" + +#: ../lib/CERT.pm:525 ../lib/KEY.pm:288 +msgid "Generating PKCS#12 failed" +msgstr "Vytváření PKCS#12 selhalo" + +#: ../lib/CERT.pm:533 ../lib/CERT.pm:616 ../lib/KEY.pm:295 ../lib/KEY.pm:381 +#, c-format +msgid "Certificate and Key successfully exported to %s" +msgstr "Certifikát a klíč úspěšně exportován do %s" + +#: ../lib/CERT.pm:546 ../lib/CERT.pm:567 ../lib/REQ.pm:693 +#, c-format +msgid "Can't create temporary file: %s: %s" +msgstr "Nelze vytvořit dočasný soubor: %s: %s" + +#: ../lib/CERT.pm:558 +#, fuzzy, c-format +msgid "Can't read Key file: %s: %s" +msgstr "Nelze číst soubor klíče: %s: %s" + +#: ../lib/CERT.pm:588 ../lib/KEY.pm:321 ../lib/KEY.pm:337 ../lib/KEY.pm:355 +msgid "Can't create temporary file" +msgstr "Nelze vytvořit dočasný soubor" + +#: ../lib/CERT.pm:609 ../lib/KEY.pm:375 +#, fuzzy, c-format +msgid "Generating %s file failed" +msgstr "Vytváření souboru %s selhalo" + +#: ../lib/CERT.pm:628 +#, c-format +msgid "Invalid Format for export_cert(): %s" +msgstr "Neplatný formát pro export_cert(): %s" + +#: ../lib/CERT.pm:648 +#, c-format +msgid "Certificate successfully exported to: %s" +msgstr "Certifikát úspěšně exportován do: %s" + +#: ../lib/GUI.pm:171 ../lib/GUI.pm:178 +msgid "CA" +msgstr "CA" + +#: ../lib/GUI.pm:185 +msgid "CA Information" +msgstr "CA informace" + +#: ../lib/GUI.pm:204 +msgid "Certificates" +msgstr "Certifikáty" + +#: ../lib/GUI.pm:244 ../lib/GUI.pm:2689 ../lib/GUI/WORDS.pm:56 +#: ../lib/GUI/X509_browser.pm:160 ../lib/GUI/X509_browser.pm:168 +#: ../lib/GUI/X509_browser.pm:177 +msgid "Common Name" +msgstr "Obecné jméno (CN)" + +#: ../lib/GUI.pm:245 ../lib/GUI.pm:1273 ../lib/GUI.pm:2314 +#: ../lib/GUI/WORDS.pm:57 ../lib/GUI/X509_browser.pm:161 +#: ../lib/GUI/X509_browser.pm:169 ../lib/GUI/X509_browser.pm:178 +msgid "eMail Address" +msgstr "eMail adresa" + +#: ../lib/GUI.pm:246 ../lib/GUI/WORDS.pm:59 ../lib/GUI/X509_browser.pm:162 +#: ../lib/GUI/X509_browser.pm:170 ../lib/GUI/X509_browser.pm:179 +msgid "Organizational Unit" +msgstr "Organizační jednotka (OU)" + +#: ../lib/GUI.pm:247 ../lib/GUI/WORDS.pm:58 ../lib/GUI/X509_browser.pm:163 +#: ../lib/GUI/X509_browser.pm:171 ../lib/GUI/X509_browser.pm:180 +msgid "Organization" +msgstr "Organizace (O)" + +#: ../lib/GUI.pm:248 ../lib/GUI/WORDS.pm:60 ../lib/GUI/X509_browser.pm:164 +#: ../lib/GUI/X509_browser.pm:172 ../lib/GUI/X509_browser.pm:181 +msgid "Location" +msgstr "Umístění" + +#: ../lib/GUI.pm:249 ../lib/GUI/WORDS.pm:61 ../lib/GUI/X509_browser.pm:165 +#: ../lib/GUI/X509_browser.pm:173 ../lib/GUI/X509_browser.pm:182 +msgid "State" +msgstr "Stát" + +#: ../lib/GUI.pm:250 ../lib/GUI/WORDS.pm:62 ../lib/GUI/X509_browser.pm:166 +#: ../lib/GUI/X509_browser.pm:174 ../lib/GUI/X509_browser.pm:183 +msgid "Country" +msgstr "Země" + +#: ../lib/GUI.pm:251 ../lib/GUI/WORDS.pm:68 ../lib/GUI/X509_browser.pm:184 +msgid "Type" +msgstr "Typ" + +#: ../lib/GUI.pm:265 +msgid "Keys" +msgstr "Klíče" + +#: ../lib/GUI.pm:308 +msgid "Requests" +msgstr "Žádosti" + +#: ../lib/GUI.pm:399 +#, c-format +msgid " Actual CA: %s" +msgstr " Aktuální CA: %s" + +#: ../lib/GUI.pm:402 +#, c-format +msgid " Actual CA: %s - Certificates" +msgstr " Aktuální CA: %s - Certifikáty" + +#: ../lib/GUI.pm:405 +#, c-format +msgid " Actual CA: %s - Keys" +msgstr " Aktuální CA: %s - Klíče" + +#: ../lib/GUI.pm:408 +#, c-format +msgid " Actual CA: %s - Requests" +msgstr " Aktuální CA: %s - Žádosti (Requests)" + +#: ../lib/GUI.pm:457 ../lib/GUI.pm:1141 +msgid "Open CA" +msgstr "Otevřít CA" + +#: ../lib/GUI.pm:463 +msgid "New CA" +msgstr "Nová CA" + +#: ../lib/GUI.pm:469 ../lib/GUI.pm:2382 +msgid "Import CA" +msgstr "Import CA" + +#: ../lib/GUI.pm:475 ../lib/GUI.pm:1143 +msgid "Delete CA" +msgstr "Odstranit CA" + +#: ../lib/GUI.pm:485 ../lib/GUI.pm:524 ../lib/GUI.pm:592 +msgid "Details" +msgstr "Detaily" + +#: ../lib/GUI.pm:491 +msgid "History" +msgstr "Historie" + +#: ../lib/GUI.pm:497 +msgid "Sub CA" +msgstr "Pod CA" + +#: ../lib/GUI.pm:503 +msgid "Export CA" +msgstr "Export CA" + +#: ../lib/GUI.pm:509 ../lib/GUI.pm:1419 +msgid "Export CRL" +msgstr "Export CRL" + +#: ../lib/GUI.pm:516 +msgid "Export Chain" +msgstr "Export řetězu" + +#: ../lib/GUI.pm:530 ../lib/GUI.pm:598 +msgid "View" +msgstr "Zobrazit" + +#: ../lib/GUI.pm:540 ../lib/GUI.pm:604 +msgid "New" +msgstr "Nový" + +#: ../lib/GUI.pm:547 ../lib/GUI.pm:578 +msgid "Export" +msgstr "Export" + +#: ../lib/GUI.pm:553 +msgid "Revoke" +msgstr "Odvolat" + +#: ../lib/GUI.pm:563 +msgid "Renew" +msgstr "Obnovit" + +#: ../lib/GUI.pm:570 ../lib/GUI.pm:584 ../lib/GUI.pm:627 +msgid "Delete" +msgstr "Odstranit" + +#: ../lib/GUI.pm:610 +msgid "Import" +msgstr "Import" + +#: ../lib/GUI.pm:620 +msgid "Sign" +msgstr "Podepsat" + +#: ../lib/GUI.pm:646 +msgid "_CA" +msgstr "_CA" + +#: ../lib/GUI.pm:649 +msgid "_Open CA" +msgstr "_Otevřít CA" + +#: ../lib/GUI.pm:654 +msgid "_New CA" +msgstr "_Nová CA" + +#: ../lib/GUI.pm:659 +msgid "_Delete CA" +msgstr "O_dstranit CA" + +#: ../lib/GUI.pm:667 +msgid "_Exit" +msgstr "Kon_ec" + +#: ../lib/GUI.pm:674 +msgid "_Preferences" +msgstr "_Předvolby" + +#: ../lib/GUI.pm:677 +#, fuzzy +msgid "Experts Only!!" +msgstr "Pouze pro odborníky!!" + +#: ../lib/GUI.pm:682 +msgid "OpenSSL _Configuration" +msgstr "OpenSSL konfigura_ce" + +#: ../lib/GUI.pm:689 ../lib/GUI.pm:692 +msgid "_Help" +msgstr "_Help-Nápověda" + +#: ../lib/GUI.pm:697 +msgid "_About TinyCA" +msgstr "O _aplikaci TinyCA" + +#: ../lib/GUI.pm:728 +msgid "Invalid mode for show_text():" +msgstr "Neplatný mód pro show_text():" + +#: ../lib/GUI.pm:733 ../lib/GUI.pm:848 ../lib/REQ.pm:236 ../lib/REQ.pm:367 +msgid "Please select a Request first" +msgstr "Prosím, nejdříve vyberte žádost (Request)" + +#: ../lib/GUI.pm:736 +msgid "Please select a certificate first" +msgstr "Prosím, nejdříve vyberte certifikát" + +#: ../lib/GUI.pm:752 ../lib/GUI.pm:867 ../lib/GUI/X509_browser.pm:456 +#: ../lib/GUI/X509_browser.pm:515 +msgid "Can't read file" +msgstr "Nelze číst soubor" + +#: ../lib/GUI.pm:754 +msgid "Request" +msgstr "Žádost" + +#: ../lib/GUI.pm:754 +msgid "Certificate" +msgstr "Certifikát" + +#: ../lib/GUI.pm:815 +#, fuzzy, c-format +msgid "Invalid mode for _show_popup_menu(): %s" +msgstr "Neplatný mód pro _show_popup_menu(): %s" + +#: ../lib/GUI.pm:843 +msgid "Invalid mode for show_details():" +msgstr "Neplatný mód pro show_details():" + +#: ../lib/GUI.pm:869 ../lib/GUI.pm:969 ../lib/GUI.pm:3040 +msgid "Request Details" +msgstr "Detaily žádosti" + +#: ../lib/GUI.pm:869 ../lib/GUI.pm:969 ../lib/GUI.pm:2897 +msgid "Certificate Details" +msgstr "Detaily certifikátu" + +#: ../lib/GUI.pm:911 ../lib/GUI.pm:1679 ../lib/GUI.pm:3061 +msgid "Import Request" +msgstr "Importovat žádost" + +#: ../lib/GUI.pm:913 ../lib/GUI.pm:2438 +msgid "Import CA Certificate" +msgstr "Importovat CA certifikát" + +#: ../lib/GUI.pm:921 +msgid "Do you want to import the following Certificate Request?" +msgstr "Chcete importovat následující žádost o certifikát?" + +#: ../lib/GUI.pm:923 +msgid "Do you want to import the following CA Certificate?" +msgstr "Chcete importovat následující certifikát CA?" + +#: ../lib/GUI.pm:977 +msgid "Subject DN" +msgstr "DN subjektu" + +#: ../lib/GUI.pm:1001 +msgid "Issuer" +msgstr "Vydavatel" + +#: ../lib/GUI.pm:1027 +msgid "Validity" +msgstr "Platnost" + +#: ../lib/GUI.pm:1043 +msgid "Key/Request Details:" +msgstr "Detaily klíče/žádosti (Request):" + +#: ../lib/GUI.pm:1043 +msgid "Key/Certificate Details:" +msgstr "Detaily klíče/certifikátu:" + +#: ../lib/GUI.pm:1059 +msgid "Fingerprints" +msgstr "Fingerprints" + +#: ../lib/GUI.pm:1075 +msgid "Requested X.509 Extensions" +msgstr "Požadovaná X.509 rozšíření" + +#: ../lib/GUI.pm:1075 +msgid "X.509v3 Extensions" +msgstr "X.509v3 rozšíření" + +#: ../lib/GUI.pm:1100 +msgid "Requested Netscape Extensions" +msgstr "Požadovaná Netscape rozšíření" + +#: ../lib/GUI.pm:1100 +msgid "Netscape Extensions" +msgstr "Netscape rozšíření" + +#: ../lib/GUI.pm:1145 +msgid "Invalid action given: " +msgstr "Zadána neplatná akce: " + +#: ../lib/GUI.pm:1167 ../lib/GUI.pm:1213 +msgid "Invalid action for show_select_ca_dialog(): " +msgstr "Neplatná akce pro show_select_ca_dialog(): " + +#: ../lib/GUI.pm:1189 +msgid "Available CAs" +msgstr "CA k dispozici" + +#: ../lib/GUI.pm:1245 +msgid "Create Request" +msgstr "Vytvořit žádost" + +#: ../lib/GUI.pm:1246 +msgid "Create a new Certificate Request" +msgstr "Vytvořit novou žádost o certifikát" + +#: ../lib/GUI.pm:1260 +msgid "Common Name (eg, your Name," +msgstr "Obecné jméno (např. Vaše jméno," + +#: ../lib/GUI.pm:1265 +msgid "your eMail Address" +msgstr "Vaše emailová adresa" + +#: ../lib/GUI.pm:1269 +msgid "or the Servers Name)" +msgstr "nebo jméno serveru)" + +#: ../lib/GUI.pm:1277 +msgid "Password (protect your private Key):" +msgstr "Heslo (chrání Váš soukromý klíč):" + +#: ../lib/GUI.pm:1281 ../lib/GUI.pm:2294 +msgid "Password (confirmation):" +msgstr "Heslo (potvrzení):" + +#: ../lib/GUI.pm:1285 ../lib/GUI.pm:2286 +msgid "Country Name (2 letter code):" +msgstr "Jméno země (kód 2 písmena):" + +#: ../lib/GUI.pm:1289 ../lib/GUI.pm:2298 +msgid "State or Province Name:" +msgstr "Jméno státu nebo kraje" + +#: ../lib/GUI.pm:1293 ../lib/GUI.pm:2302 +msgid "Locality Name (eg. city):" +msgstr "Jméno místa (např. město):" + +#: ../lib/GUI.pm:1297 ../lib/GUI.pm:2306 +msgid "Organization Name (eg. company):" +msgstr "Jméno organizace (např. firma):" + +#: ../lib/GUI.pm:1303 ../lib/GUI.pm:1308 ../lib/GUI.pm:2310 +msgid "Organizational Unit Name (eg. section):" +msgstr "Jméno organizační jednotky (např. sekce):" + +#: ../lib/GUI.pm:1313 ../lib/GUI.pm:2322 ../lib/GUI/WORDS.pm:65 +msgid "Keylength" +msgstr "Délka klíče" + +#: ../lib/GUI.pm:1321 ../lib/GUI.pm:2352 +msgid "Digest" +msgstr "Výtah-digest" + +#: ../lib/GUI.pm:1328 +msgid "Algorithm" +msgstr "Algoritmus" + +#: ../lib/GUI.pm:1359 ../lib/GUI.pm:2918 +msgid "Revoke Certificate" +msgstr "Odvolat certifikát" + +#: ../lib/GUI.pm:1368 ../lib/GUI.pm:1444 ../lib/GUI.pm:2093 +msgid "CA Password:" +msgstr "Heslo CA:" + +#: ../lib/GUI.pm:1374 +msgid "Revocation Reason:" +msgstr "Důvod odvolání:" + +#: ../lib/GUI.pm:1419 +msgid "Export Revocation List to File" +msgstr "Exportovat seznam odvolaných certifikátů (CRL) do souboru" + +#: ../lib/GUI.pm:1427 ../lib/GUI.pm:1515 ../lib/GUI.pm:1563 ../lib/GUI.pm:1687 +#: ../lib/GUI.pm:1755 +msgid "File:" +msgstr "Soubor:" + +#: ../lib/GUI.pm:1438 ../lib/GUI.pm:1526 ../lib/GUI.pm:1574 ../lib/GUI.pm:1697 +#: ../lib/GUI.pm:1772 ../lib/GUI.pm:2435 ../lib/GUI.pm:2454 ../lib/GUI.pm:2473 +#: ../lib/GUI.pm:2492 +msgid "Browse..." +msgstr "Procházet..." + +#: ../lib/GUI.pm:1441 ../lib/GUI.pm:1554 ../lib/GUI.pm:1577 +msgid "Export CA Certificate" +msgstr "Exportovat certifikát CA" + +#: ../lib/GUI.pm:1448 ../lib/GUI.pm:2099 ../lib/GUI.pm:2318 +msgid "Valid for (Days):" +msgstr "Platný (dnů):" + +#: ../lib/GUI.pm:1452 ../lib/GUI.pm:1581 ../lib/GUI.pm:1779 +msgid "Export Format:" +msgstr "Formát exportu:" + +#: ../lib/GUI.pm:1458 ../lib/GUI.pm:1587 +msgid "PEM" +msgstr "PEM" + +#: ../lib/GUI.pm:1467 ../lib/GUI.pm:1596 +msgid "DER" +msgstr "DER" + +#: ../lib/GUI.pm:1476 ../lib/GUI.pm:1605 +msgid "TXT" +msgstr "TXT" + +#: ../lib/GUI.pm:1507 ../lib/GUI.pm:1529 +msgid "Export CA Certificate Chain" +msgstr "Exportovat řetěz certifikátů CA (CA certificate chain)" + +#: ../lib/GUI.pm:1508 +msgid "Export CA Certificate Chain to File" +msgstr "Exportovat řetěz certifikátů CA (CA Certificate Chain) do souboru" + +#: ../lib/GUI.pm:1555 +msgid "Export CA Certificate to File" +msgstr "Exportovat certifikát CA do souboru" + +#: ../lib/GUI.pm:1635 ../lib/GUI.pm:1636 +msgid "Export Key without Passphrase" +msgstr "Exportovat klíč bez fráze" + +#: ../lib/GUI.pm:1640 +msgid "I hope you know what you're doing?" +msgstr "Doufám, že víte, co děláte!" + +#: ../lib/GUI.pm:1644 +msgid "The Key Passphrase is needed for decryption of the Key" +msgstr "Fráze klíče je nutná pro dekódování klíče" + +#: ../lib/GUI.pm:1653 +msgid "Password:" +msgstr "Heslo:" + +#: ../lib/GUI.pm:1679 ../lib/GUI.pm:1700 +msgid "Import Request from File" +msgstr "Importovat žádost ze souboru" + +#: ../lib/GUI.pm:1721 ../lib/GUI.pm:1759 ../lib/GUI.pm:2911 +msgid "Export Certificate" +msgstr "Exportovat certifikát" + +#: ../lib/GUI.pm:1723 ../lib/GUI.pm:1761 ../lib/GUI.pm:2868 +msgid "Export Key" +msgstr "Exportovat klíč" + +#: ../lib/GUI.pm:1726 +msgid "Invalid mode for show_export_dialog(): " +msgstr "Neplatný mód pro show_export_dialog(): " + +#: ../lib/GUI.pm:1743 +msgid "Export Certificate to File" +msgstr "Exportovat certifikát do souboru" + +#: ../lib/GUI.pm:1745 +msgid "Export Key to File" +msgstr "Exportovat klíč do souboru" + +#: ../lib/GUI.pm:1783 +msgid "PEM (Certificate)" +msgstr "PEM (certifikát)" + +#: ../lib/GUI.pm:1785 +msgid "PEM (Key)" +msgstr "PEM (klíč)" + +#: ../lib/GUI.pm:1794 +msgid "DER (Certificate)" +msgstr "DER (certifikát)" + +#: ../lib/GUI.pm:1796 +msgid "DER (Key without Passphrase)" +msgstr "DER (klíč bez fráze)" + +#: ../lib/GUI.pm:1804 +msgid "PKCS#12 (Certificate & Key)" +msgstr "PKCS#12 (certifikát a klíč)" + +#: ../lib/GUI.pm:1811 +msgid "Zip (Certificate & Key)" +msgstr "Zip (certifikát a klíč)" + +#: ../lib/GUI.pm:1821 +#, fuzzy +msgid "Tar (Certificate & Key)" +msgstr "Tar (certifikát a klíč)" + +#: ../lib/GUI.pm:1833 +msgid "TXT (Certificate)" +msgstr "TXT (certifikát)" + +#: ../lib/GUI.pm:1839 +#, fuzzy +msgid "Without Passphrase (PEM/PKCS#12)" +msgstr "Bez fráze (PEM/PKCS#12)" + +#: ../lib/GUI.pm:1845 ../lib/GUI.pm:1872 ../lib/GUI.pm:1891 ../lib/GUI.pm:2018 +#: ../lib/GUI.pm:2043 ../lib/GUI.pm:2196 +msgid "Yes" +msgstr "Ano" + +#: ../lib/GUI.pm:1850 ../lib/GUI.pm:1877 ../lib/GUI.pm:1896 ../lib/GUI.pm:2024 +#: ../lib/GUI.pm:2049 ../lib/GUI.pm:2202 +msgid "No" +msgstr "Ne" + +#: ../lib/GUI.pm:1860 +msgid "Include Key (PEM)" +msgstr "Včetně klíče (PEM)" + +#: ../lib/GUI.pm:1865 +#, fuzzy +msgid "Include Certificate (PEM)" +msgstr "Včetně certifikátu (PEM)" + +#: ../lib/GUI.pm:1885 +#, fuzzy +msgid "Include Fingerprint (PEM)" +msgstr "Včetně Fingerprintu (PEM)" + +#: ../lib/GUI.pm:1993 ../lib/GUI.pm:1994 +msgid "Export to PKCS#12" +msgstr "Exportovat do PKCS#12" + +#: ../lib/GUI.pm:2001 +msgid "Key Password:" +msgstr "Heslo klíče:" + +#: ../lib/GUI.pm:2005 +msgid "Export Password:" +msgstr "Heslo pro export:" + +#: ../lib/GUI.pm:2008 +msgid "Friendly Name:" +msgstr "Jednoduché jméno:" + +#: ../lib/GUI.pm:2012 +#, fuzzy +msgid "Without Passphrase" +msgstr "Bez fráze" + +#: ../lib/GUI.pm:2037 +msgid "Add CA Certificate to PKCS#12 structure" +msgstr "Přidat certifikát CA do PKCS#12 struktury" + +#: ../lib/GUI.pm:2085 ../lib/GUI.pm:3068 +msgid "Sign Request" +msgstr "Podepsat žádost" + +#: ../lib/GUI.pm:2085 +msgid "Sign Request/Create Certificate" +msgstr "Podepsat žádost/Vytvořit certifikát" + +#: ../lib/GUI.pm:2110 ../lib/GUI.pm:2155 +msgid "Subject alternative name (IP Address):" +msgstr "Alternativní jméno subjektu (IP adresa):" + +#: ../lib/GUI.pm:2113 ../lib/GUI.pm:2158 +msgid "Subject alternative name (DNS Name):" +msgstr "Alternativní jméno subjektu (DNS jméno):" + +#: ../lib/GUI.pm:2116 ../lib/GUI.pm:2164 +#, fuzzy +msgid "Subject alternative name (raw):" +msgstr "Alternativní jméno subjektu (raw):" + +#: ../lib/GUI.pm:2124 ../lib/GUI.pm:2172 +msgid "Extended Key Usage:" +msgstr "Rozšířené použití klíče:" + +#: ../lib/GUI.pm:2131 +msgid "Netscape SSL Server Name:" +msgstr "Netscape jméno serveru SSL:" + +#: ../lib/GUI.pm:2138 ../lib/GUI.pm:2179 +msgid "Netscape Revocation URL:" +msgstr "Netscape URL odvolaných:" + +#: ../lib/GUI.pm:2145 ../lib/GUI.pm:2186 +msgid "Netscape Renewal URL:" +msgstr "Netscape URL obnovených:" + +#: ../lib/GUI.pm:2161 +msgid "Subject alternative name (eMail Address):" +msgstr "Alternativní jméno subjektu (eMailová adresa):" + +#: ../lib/GUI.pm:2208 +msgid "Add eMail Address to Subject DN:" +msgstr "Přidat eMailovou adresu k DN subjektu:" + +#: ../lib/GUI.pm:2238 ../lib/GUI.pm:2242 +msgid "Create CA" +msgstr "Vytvořit CA" + +#: ../lib/GUI.pm:2238 +msgid "Create a new Sub CA" +msgstr "Vytvořit novou podřízenou CA" + +#: ../lib/GUI.pm:2242 +msgid "Create a new CA" +msgstr "Vytvořit novou CA" + +#: ../lib/GUI.pm:2255 +msgid "CA Password (for creating the new CA):" +msgstr "Heslo CA (pro vytvoření nové CA):" + +#: ../lib/GUI.pm:2266 ../lib/GUI.pm:2403 +msgid "Name (for local storage):" +msgstr "Jméno (pro lokální uložení):" + +#: ../lib/GUI.pm:2273 +msgid "Data for CA Certificate" +msgstr "Data pro certifikát CA" + +#: ../lib/GUI.pm:2282 +msgid "Common Name (for the CA):" +msgstr "Obecné jméno (pro CA):" + +#: ../lib/GUI.pm:2290 +msgid "Password (needed for signing):" +msgstr "Heslo (potřebné pro podepsování):" + +#: ../lib/GUI.pm:2382 +msgid "Import an existing CA into TinyCA" +msgstr "Import existující CA do TinyCA" + +#: ../lib/GUI.pm:2393 +msgid "Password of the private CA key (Needed for import):" +msgstr "Heslo soukromého klíče CA (potřebné pro import):" + +#: ../lib/GUI.pm:2407 +msgid "New password for the CA:" +msgstr "Nové heslo pro CA:" + +#: ../lib/GUI.pm:2411 +msgid "Confirm password:" +msgstr "Potvrzení hesla:" + +#: ../lib/GUI.pm:2416 +msgid "Files/Directories to import" +msgstr "Soubory/Adresáře pro import" + +#: ../lib/GUI.pm:2424 +msgid "CA Certificate (PEM/DER):" +msgstr "Certifikát CA (PEM/DER):" + +#: ../lib/GUI.pm:2443 +msgid "CA private key (PEM/DER):" +msgstr "Soukromý klíč CA (PEM/DER):" + +#: ../lib/GUI.pm:2457 +#, fuzzy +msgid "Import CA private Key" +msgstr "Importovat soukromý klíč CA" + +#: ../lib/GUI.pm:2462 +#, fuzzy +msgid "OpenSSL Index File (index.txt):" +msgstr "OpenSSL indexový soubor (index.txt):" + +#: ../lib/GUI.pm:2476 +msgid "Import Index File" +msgstr "Importovat indexový soubor" + +#: ../lib/GUI.pm:2481 +msgid "Directory containing certificates (PEM/DER):" +msgstr "Adresář obsahující certifikáty (PEM/DER):" + +#: ../lib/GUI.pm:2495 +#, fuzzy +msgid "Import Certificates from directory" +msgstr "Importovat certifikáty z adresáře" + +#: ../lib/GUI.pm:2509 +msgid "You are kidding, are you??" +msgstr "Žertuješ, co?" + +#: ../lib/GUI.pm:2531 +#, fuzzy +msgid "Spanish: Ramon Pons Vivanco " +msgstr "Španělský: Ramon Pons Vivanco " + +#: ../lib/GUI.pm:2532 +#, fuzzy +msgid "Czech: Robert Wolf " +msgstr "Český: Robert Wolf " + +#: ../lib/GUI.pm:2533 +#, fuzzy +msgid "French: Thibault Le Meur " +msgstr "Francouzský: Thibault Le Meur " + +#: ../lib/GUI.pm:2549 +msgid "Do you really want to delete the selected Request?" +msgstr "Opravdu chcete odstranit vybranou žádost (Request)?" + +#: ../lib/GUI.pm:2551 +msgid "Do you really want to delete the selected Key?" +msgstr "Opravdu chcete odstranit vybraný klíč?" + +#: ../lib/GUI.pm:2553 +msgid "Do you really want to delete the selected Certificate?" +msgstr "Opravdu chcete odstranit vybraný certifikát?" + +#: ../lib/GUI.pm:2603 +#, fuzzy +msgid "Overwrite Request/Key" +msgstr "Přepsat žádost(Request)/klíč" + +#: ../lib/GUI.pm:2609 +msgid "The Key or the Request is already existing!" +msgstr "Klíč nebo žádost (Request) již existuje!" + +#: ../lib/GUI.pm:2614 +#, fuzzy +msgid "You won't be able to sign this Request" +msgstr "Nebudete moci podepsat tuto žádost (Request)" + +#: ../lib/GUI.pm:2619 +#, fuzzy +msgid "if the corresponding certificate is still valid" +msgstr "pokud odpovídající certifikát je stále platný" + +#: ../lib/GUI.pm:2636 +msgid "The Certificate will be longer valid than your CA!" +msgstr "Certifikát bude platný déle než Vaše CA!" + +#: ../lib/GUI.pm:2638 +msgid "This may cause problems with some software!!" +msgstr "Toto může způsobit problémy s některými programy!!" + +#: ../lib/GUI.pm:2653 +msgid "Expirationdate Warning" +msgstr "Varování data platnosti" + +#: ../lib/GUI.pm:2688 ../lib/GUI/WORDS.pm:69 +msgid "Serial" +msgstr "Seriové číslo" + +#: ../lib/GUI.pm:2690 ../lib/GUI/WORDS.pm:70 ../lib/GUI/X509_browser.pm:175 +msgid "Status" +msgstr "Stav" + +#: ../lib/GUI.pm:2691 ../lib/GUI/WORDS.pm:64 +msgid "Expiration Date" +msgstr "Datum zániku" + +#: ../lib/GUI.pm:2692 +#, fuzzy +msgid "Revocation Date" +msgstr "Datum odvolání" + +#: ../lib/GUI.pm:2693 +#, fuzzy +msgid "Revocation Reason" +msgstr "Důvod odvolání:" + +#: ../lib/GUI.pm:2719 ../lib/OpenSSL.pm:705 +msgid "EXPIRED" +msgstr "ZANIKLÝ" + +#: ../lib/GUI.pm:2721 ../lib/OpenSSL.pm:718 +msgid "REVOKED" +msgstr "ODVOLANÝ" + +#: ../lib/GUI.pm:2741 +msgid "CA History" +msgstr "Historie CA" + +#: ../lib/GUI.pm:2775 +msgid "Overwrite Certificate" +msgstr "Přepsat certifikát" + +#: ../lib/GUI.pm:2781 +#, fuzzy +msgid "There seems to be a certificate with the same Subject already." +msgstr "Zdá se, že již existuje certifikát se stejným subjectem." + +#: ../lib/GUI.pm:2786 +msgid "" +"Creating a new one (overwrite) will fail if it's not revoked or expired!" +msgstr "Vytvoření nového (přepsání) selže, pokud není odvolán nebo nezaniknul!" + +#: ../lib/GUI.pm:2792 +msgid "Really try to overwrite the Certificate?" +msgstr "Opravdu chcete zkusit přepsat certifikát?" + +#: ../lib/GUI.pm:2825 +msgid "Convert CA" +msgstr "Konvertovat CA" + +#: ../lib/GUI.pm:2833 +msgid "" +"This CA seems to be created with openssl 0.9.6x. And it seems like you have " +"switched to openssl 0.9.7x." +msgstr "" +"Zdá se, že tato CA byla vytvořena pomocí openssl 0.9.6x. A zdá se, že jste " +"změnil openssl na verzi 0.9.7x." + +#: ../lib/GUI.pm:2841 +msgid "" +"You won't be able to revoke the existing certificates without converting the " +"index file of this CA to the new format." +msgstr "" +"Nebude možné odvolat existující certifikáty bez zkonvertování indexového " +"souboru této CA na nový formát." + +#: ../lib/GUI.pm:2849 +msgid "" +"Attention: it will not be easy to switch back, this has to be done manually" +msgstr "" +"Pozor: nebude snadné vrátit se zpět, bude to muset být provedeno manuálně" + +#: ../lib/GUI.pm:2875 +msgid "Delete Key" +msgstr "Odstranit klíč" + +#: ../lib/GUI.pm:2904 +msgid "View Certificate" +msgstr "Zobrazit certifikát" + +#: ../lib/GUI.pm:2925 +#, fuzzy +msgid "Renew Certificate" +msgstr "Obnovit certifikát" + +#: ../lib/GUI.pm:2933 +msgid "Delete Certificate" +msgstr "Odstranit certifikát" + +#: ../lib/GUI.pm:2956 +msgid "Create Key and Certificate (Server)" +msgstr "Vytvořit klíč a certifikát (Server)" + +#: ../lib/GUI.pm:2962 +msgid "Create Key and Certificate (Client)" +msgstr "Vytvořit klíč a certifikát (Klient)" + +#: ../lib/GUI.pm:2983 +#, fuzzy +msgid "Renew Certificate (Server)" +msgstr "Obnovit certifikát (Server)" + +#: ../lib/GUI.pm:2990 +#, fuzzy +msgid "Renew Certificate (Client)" +msgstr "Obnovit certifikát (Klient)" + +#: ../lib/GUI.pm:3012 +msgid "Sign Request (Server)" +msgstr "Podepsat žádost (Server)" + +#: ../lib/GUI.pm:3019 +msgid "Sign Request (Client)" +msgstr "Podepsat žádost (Klient)" + +#: ../lib/GUI.pm:3047 +msgid "View Request" +msgstr "Zobrazit žádost" + +#: ../lib/GUI.pm:3054 +msgid "New Request" +msgstr "Nová žádost" + +#: ../lib/GUI.pm:3076 +msgid "Delete Request" +msgstr "Odstranit žádost" + +#: ../lib/HELPERS.pm:207 +#, c-format +msgid "Can't write exportdir: %s, %s" +msgstr "Nelze zapsat exportdir: %s, %s" + +#: ../lib/KEY.pm:45 ../lib/KEY.pm:137 +msgid "Please select a Key first" +msgstr "Prosím, vyberte nejdříve klíč" + +#: ../lib/KEY.pm:54 +msgid "Key file not found:" +msgstr "Soubor klíče nebyl nalezen:" + +#: ../lib/KEY.pm:101 +msgid "Can't open key directory" +msgstr "Nelze otevřít adresář klíčů" + +#: ../lib/KEY.pm:194 +msgid "" +"Wrong password given\n" +"Decrypting of the Key failed\n" +"Export is not possible" +msgstr "" +"Zadáno nesprávné heslo\n" +"Dekódování klíče selhalo\n" +"Není možné exportovat" + +#: ../lib/KEY.pm:199 +msgid "Converting failed, Export not possible" +msgstr "Konverze selhala, není možné exportovat" + +#: ../lib/KEY.pm:206 ../lib/KEY.pm:410 +#, c-format +msgid "Can't open Key file: %s: %s" +msgstr "Nelze otevřít soubor klíče: %s: %s" + +#: ../lib/KEY.pm:239 +#, c-format +msgid "Key succesfully exported to %s" +msgstr "Klíč úspěšně exportován do %s" + +#: ../lib/KEY.pm:255 +msgid "Certificate is necessary for export as PKCS#12" +msgstr "Certifikát je vyžadován pro export jako PKCS#12" + +#: ../lib/KEY.pm:305 +#, fuzzy, c-format +msgid "Certificate is necessary for export as %s file" +msgstr "Certifikát je vyžadován pro export jako %s soubor" + +#: ../lib/KEY.pm:330 +msgid "Can't read Key file" +msgstr "Nelze číst soubor s klíčem" + +#: ../lib/KEY.pm:392 +#, c-format +msgid "Invalid format for export requested: %s" +msgstr "Požadován neplatný formát pro export: %s" + +#: ../lib/KEY.pm:398 +msgid "Something Failed ??" +msgstr "Něco selhalo ??" + +#: ../lib/KEY.pm:448 +#, c-format +msgid "" +"Can't open Key file:\n" +"%s" +msgstr "" +"Nelze otevřít soubor klíče:\n" +"%s" + +#: ../lib/KEY.pm:485 +msgid "The password for your old CA Key is wrong" +msgstr "Heslo pro Váš starý klíč CA je špatné" + +#: ../lib/OpenSSL.pm:73 +msgid "Creating DSA key in progress..." +msgstr "Probíhá tvorba DSA klíče..." + +#: ../lib/OpenSSL.pm:107 +msgid "Creating RSA key in progress..." +msgstr "Probíhá tvorba RSA klíče..." + +#: ../lib/OpenSSL.pm:456 +#, c-format +msgid "Can't open CRL '%s': %s" +msgstr "Nelze otevřít CRL '%s': %s" + +#: ../lib/OpenSSL.pm:471 ../lib/OpenSSL.pm:484 +msgid "Error converting CRL" +msgstr "Chyba konverze CRL" + +#: ../lib/OpenSSL.pm:582 ../lib/OpenSSL.pm:595 +msgid "Error converting Certificate" +msgstr "Chyba konverze certifikátu" + +#: ../lib/OpenSSL.pm:655 ../lib/OpenSSL.pm:672 +msgid "Error reading fingerprint from Certificate" +msgstr "Chyba čtení fingerprintu z certifikátu" + +#: ../lib/OpenSSL.pm:690 +msgid "Error reading subject from Certificate" +msgstr "Chyba čtení subjektu z certifikátu" + +#: ../lib/OpenSSL.pm:700 +msgid "Can't read CRL" +msgstr "Nelze číst CRL" + +#: ../lib/OpenSSL.pm:723 +msgid "UNDEFINED" +msgstr "NEDEFINOVANÝ" + +#: ../lib/OpenSSL.pm:750 +#, c-format +msgid "Can't open Request file %s: %s" +msgstr "Nelze otevřít soubor s žádostí %s: %s" + +#: ../lib/OpenSSL.pm:767 ../lib/OpenSSL.pm:781 ../lib/REQ.pm:685 +msgid "Error converting Request" +msgstr "Chyba při konverzi žádosti" + +#: ../lib/OpenSSL.pm:863 +#, c-format +msgid "Can't open file %s: %s" +msgstr "Nelze otevřít soubor %s: %s" + +#: ../lib/OpenSSL.pm:981 ../lib/OpenSSL.pm:1013 +#, c-format +msgid "Can't read index %s: %s" +msgstr "Nelze číst index %s: %s" + +#: ../lib/OpenSSL.pm:1023 +#, c-format +msgid "Can't write index %s: %s" +msgstr "Nelze zapsat index %s: %s" + +#: ../lib/REQ.pm:58 +#, c-format +msgid "Strange value for 'opts': %s" +msgstr "Zvláštní hodnota pro 'opts': %s" + +#: ../lib/REQ.pm:101 +msgid "Please specify at least Common Name " +msgstr "Prosím, zadejte alespoň obecné jméno " + +#: ../lib/REQ.pm:102 +msgid "and Password" +msgstr "a heslo" + +#: ../lib/REQ.pm:246 ../lib/REQ.pm:376 +msgid "Request file not found" +msgstr "Nebyl nalezen soubor žádosti" + +#: ../lib/REQ.pm:299 +msgid "Can't open Request directory" +msgstr "Nelze otevřít adresář žádostí" + +#: ../lib/REQ.pm:320 +#, c-format +msgid " Read Request: %s" +msgstr " Čtení žádosti: %s" + +#: ../lib/REQ.pm:414 +#, fuzzy +msgid "Can't read Request file" +msgstr "Nelze číst soubor žádosti:" + +#: ../lib/REQ.pm:458 +msgid "Can't read serial" +msgstr "Nelze číst sériové číslo" + +#: ../lib/REQ.pm:531 +msgid "" +"Wrong CA password given\n" +"Signing of the Request failed" +msgstr "" +"Zadáno nesprávné heslo CA\n" +"Podepsání žádosti selhalo" + +#: ../lib/REQ.pm:537 +msgid "" +"CA Key not found\n" +"Signing of the Request failed" +msgstr "" +"Klíč CA nebyl nalezen\n" +"Podepsání žádosti selhalo" + +#: ../lib/REQ.pm:543 +msgid "" +"Certificate already existing\n" +"Signing of the Request failed" +msgstr "" +"Certifikát již existuje\n" +"Podepsání žádosti selhalo" + +#: ../lib/REQ.pm:549 +msgid "" +"Invalid IP Address given\n" +"Signing of the Request failed" +msgstr "" +"Byla zadána neplatná IP adresa\n" +"Podepsání žádosti selhalo" + +#: ../lib/REQ.pm:556 ../lib/REQ.pm:574 +msgid "Signing of the Request failed" +msgstr "Podepsání žádosti selhalo" + +#: ../lib/REQ.pm:581 +msgid "Can't read Certificate file" +msgstr "Nelze číst soubor certifikátu" + +#: ../lib/REQ.pm:587 ../lib/REQ.pm:597 +msgid "Can't write Certificate file" +msgstr "Nelze zapsat soubor certifikátu" + +#: ../lib/REQ.pm:609 +msgid "" +"Request signed succesfully.\n" +"Certificate created" +msgstr "" +"Žádost úspěšně podepsána.\n" +"Certifikát vytvořen" + +#: ../lib/REQ.pm:650 +msgid "Please select a Request file first" +msgstr "Prosím, vyberte nejdříve soubor žádosti" + +#: ../lib/REQ.pm:656 +msgid "Can't find Request file: " +msgstr "Nelze najít soubor žádosti: " + +#: ../lib/REQ.pm:662 +msgid "Can't read Request file:" +msgstr "Nelze číst soubor žádosti:" + +#: ../lib/REQ.pm:708 +msgid "Parsing Request failed" +msgstr "Zpracování žádosti selhalo" + +#: ../lib/TCONFIG.pm:42 +msgid "Please select a CA first" +msgstr "Prosím, vyberte nejdříve CA" + +#: ../lib/TCONFIG.pm:49 +msgid "Can't open configuration" +msgstr "Nelze otevřít konfiguraci" + +#: ../lib/TCONFIG.pm:284 ../lib/TCONFIG.pm:299 ../lib/GUI/TCONFIG.pm:47 +#: ../lib/GUI/TCONFIG.pm:1302 +msgid "Can't get CA name" +msgstr "Nelze získat jméno CA" + +#: ../lib/TCONFIG.pm:327 +msgid "Can't open configfile" +msgstr "Nelze otevřít configfile" + +#: ../lib/GUI/HELPERS.pm:54 ../lib/GUI/HELPERS.pm:94 ../lib/GUI/HELPERS.pm:135 +#, fuzzy +msgid "Command Details" +msgstr "Detaily příkazu" + +#: ../lib/GUI/HELPERS.pm:305 +msgid "Request Files (*.pem, *.der, *.req)" +msgstr "Soubory žádosti (*.pem, *.der, *.req)" + +#: ../lib/GUI/HELPERS.pm:312 +msgid "All Files (*.*)" +msgstr "Všechny soubory (*.*)" + +#: ../lib/GUI/TCONFIG.pm:74 +msgid "" +"All Settings are written unchanged to openssl.conf.\n" +"So please study the documentation of OpenSSL if you don't know exactly what " +"to do.\n" +"If you are still unsure - keep the defaults and everything is expected to " +"work fine." +msgstr "" +"Všechna nastavení jsou zapsána beze změny do openssl.conf.\n" +"Prosím, pročtěte si dokumentaci k OpenSSL, pokud nevíte přesně, co máte " +"dělat.\n" +"Pokud si stále nejste jisti, nechte výchozí nastavení a všechny by mělo " +"fungovat správně." + +#: ../lib/GUI/TCONFIG.pm:108 ../lib/GUI/TCONFIG.pm:116 +msgid "OpenSSL Configuration" +msgstr "Konfigurace OpenSSL" + +#: ../lib/GUI/TCONFIG.pm:129 +msgid "Only change these options, if you really know, what you are doing!!" +msgstr "Tato nastavení měňte pouze v případě, že víte, co děláte!!" + +#: ../lib/GUI/TCONFIG.pm:137 +msgid "You should be aware, that some options may break some crappy software!!" +msgstr "" +"Mějte na paměti, že některá nastavení mohou narušit některý špatný software!!" + +#: ../lib/GUI/TCONFIG.pm:146 ../lib/GUI/TCONFIG.pm:1348 +msgid "If you are unsure: leave the defaults untouched" +msgstr "Pokud jste nejistý: nechte výchozí hodnoty nezměněny" + +#: ../lib/GUI/TCONFIG.pm:182 +msgid "These Settings are passed to OpenSSL for creating Server Certificates" +msgstr "Tato nastavení jsou předána OpenSSL pro vytváření certifikátů serveru" + +#: ../lib/GUI/TCONFIG.pm:187 ../lib/GUI/TCONFIG.pm:612 +#: ../lib/GUI/TCONFIG.pm:1019 ../lib/GUI/TCONFIG.pm:1239 +#: ../lib/GUI/TCONFIG.pm:1340 +msgid "Multiple Values can be separated by \",\"" +msgstr "Více hodnot může být odděleno \",\"" + +#: ../lib/GUI/TCONFIG.pm:207 ../lib/GUI/TCONFIG.pm:209 +msgid "Server Certificate Settings" +msgstr "Nastavení certifikátu serveru" + +#: ../lib/GUI/TCONFIG.pm:215 ../lib/GUI/TCONFIG.pm:638 +#: ../lib/GUI/TCONFIG.pm:1047 ../lib/GUI/TCONFIG.pm:1462 +msgid "Subject alternative name (subjectAltName):" +msgstr "Alternativní jméno subjektu (subjectAltName):" + +#: ../lib/GUI/TCONFIG.pm:312 ../lib/GUI/TCONFIG.pm:744 +#: ../lib/GUI/TCONFIG.pm:1107 ../lib/GUI/TCONFIG.pm:1358 +msgid "Key Usage (keyUsage):" +msgstr "Užití klíče (keyUsage):" + +#: ../lib/GUI/TCONFIG.pm:391 ../lib/GUI/TCONFIG.pm:819 +msgid "Extended Key Usage (extendedKeyUsage):" +msgstr "Rozšíření užití klíče (extendedKeyUsage):" + +#: ../lib/GUI/TCONFIG.pm:467 ../lib/GUI/TCONFIG.pm:894 +#: ../lib/GUI/TCONFIG.pm:1076 ../lib/GUI/TCONFIG.pm:1431 +msgid "Netscape Certificate Type (nsCertType):" +msgstr "Netscape typ certifikátu (nsCertType):" + +#: ../lib/GUI/TCONFIG.pm:496 +msgid "Netscape SSL Server Name (nsSslServerName):" +msgstr "Netscape jméno SSL serveru (nsSslServerName):" + +#: ../lib/GUI/TCONFIG.pm:521 ../lib/GUI/TCONFIG.pm:924 +#: ../lib/GUI/TCONFIG.pm:1182 +msgid "Netscape Revocation URL (nsRevocationUrl):" +msgstr "Netscape URL odvolaných (nsRevocationUrl):" + +#: ../lib/GUI/TCONFIG.pm:546 ../lib/GUI/TCONFIG.pm:948 +msgid "Netscape Renewal URL (nsRenewalUrl):" +msgstr "Netscape URL obnovení (nsRenewalUrl):" + +#: ../lib/GUI/TCONFIG.pm:607 +msgid "These Settings are passed to OpenSSL for creating Client Certificates" +msgstr "Tato nastavení jsou předána OpenSSL pro vytváření certifikátů klienta" + +#: ../lib/GUI/TCONFIG.pm:632 +msgid "Client Certificate Settings" +msgstr "Nastavení certifikátu klienta" + +#: ../lib/GUI/TCONFIG.pm:1014 +msgid "These Settings are passed to OpenSSL for creating CA Certificates" +msgstr "Tato nastavení jsou předána OpenSSL pro vytváření certifikátů CA" + +#: ../lib/GUI/TCONFIG.pm:1039 ../lib/GUI/TCONFIG.pm:1041 +msgid "CA Certificate Settings" +msgstr "Nastavení certifikátu CA" + +#: ../lib/GUI/TCONFIG.pm:1234 +msgid "" +"These Settings are passed to OpenSSL for creating Certificate Revocation " +"Lists" +msgstr "" +"Tato nastavení jsou předána OpenSSL pro vytváření seznamů odvolaných " +"certifikátů" + +#: ../lib/GUI/TCONFIG.pm:1260 +msgid "Revocation List Settings" +msgstr "Nastavení seznamu odvolaných" + +#: ../lib/GUI/TCONFIG.pm:1322 +msgid "CA Configuration" +msgstr "Nastavení CA" + +#: ../lib/GUI/TCONFIG.pm:1330 +msgid "These Settings are passed to OpenSSL for creating this CA Certificate" +msgstr "Tato nastavení jsou předána OpenSSL pro vytvoření certifikátu této CA" + +#: ../lib/GUI/TCONFIG.pm:1335 +msgid "and the CA Certificates of every SubCA, created with this CA." +msgstr "a CA certifikátů každé podřízené CA, vytvořených touto CA." + +#: ../lib/GUI/WORDS.pm:26 ../lib/GUI/WORDS.pm:73 +msgid "Not set" +msgstr "Není nastaveno" + +#: ../lib/GUI/WORDS.pm:27 ../lib/GUI/WORDS.pm:74 +msgid "Ask User" +msgstr "Dotazovat uživatele" + +#: ../lib/GUI/WORDS.pm:28 ../lib/GUI/WORDS.pm:75 +msgid "critical" +msgstr "kritické" + +#: ../lib/GUI/WORDS.pm:29 ../lib/GUI/WORDS.pm:76 +msgid "not critical" +msgstr "není kritické" + +#: ../lib/GUI/WORDS.pm:30 ../lib/GUI/WORDS.pm:77 +msgid "Copy Email" +msgstr "Zkopírovat Email" + +#: ../lib/GUI/WORDS.pm:31 ../lib/GUI/WORDS.pm:78 +msgid "raw" +msgstr "raw" + +#: ../lib/GUI/WORDS.pm:32 ../lib/GUI/WORDS.pm:79 +msgid "DNS Name" +msgstr "DNS jméno" + +#: ../lib/GUI/WORDS.pm:33 ../lib/GUI/WORDS.pm:81 +msgid "IP Address" +msgstr "IP adresa" + +#: ../lib/GUI/WORDS.pm:34 ../lib/GUI/WORDS.pm:80 +msgid "Email" +msgstr "Email" + +#: ../lib/GUI/WORDS.pm:35 ../lib/GUI/WORDS.pm:82 +msgid "SSL Server" +msgstr "SSL server" + +#: ../lib/GUI/WORDS.pm:36 ../lib/GUI/WORDS.pm:83 +msgid "SSL Server, SSL Client" +msgstr "SSL server, SSL klient" + +#: ../lib/GUI/WORDS.pm:37 ../lib/GUI/WORDS.pm:84 +msgid "Key Encipherment" +msgstr "Šifrování klíčem" + +#: ../lib/GUI/WORDS.pm:38 ../lib/GUI/WORDS.pm:85 +msgid "Digital Signature" +msgstr "Digitální podpis" + +#: ../lib/GUI/WORDS.pm:39 ../lib/GUI/WORDS.pm:86 +msgid "Key Encipherment, Digital Signature" +msgstr "Šifrování klíčem, Digitální podpis" + +#: ../lib/GUI/WORDS.pm:40 ../lib/GUI/WORDS.pm:87 +msgid "Object Signing" +msgstr "Podepisování objektů" + +#: ../lib/GUI/WORDS.pm:41 ../lib/GUI/WORDS.pm:91 +msgid "SSL Client, Object Signing" +msgstr "SSL klient, Podepisování objektů" + +#: ../lib/GUI/WORDS.pm:42 ../lib/GUI/WORDS.pm:89 +msgid "SSL Client, Email(S/MIME)" +msgstr "SSL klient, Email(S/MIME)" + +#: ../lib/GUI/WORDS.pm:43 ../lib/GUI/WORDS.pm:90 +msgid "SSL Client" +msgstr "SSL klient" + +#: ../lib/GUI/WORDS.pm:44 ../lib/GUI/WORDS.pm:88 +msgid "Email(S/MIME)" +msgstr "Email(S/MIME)" + +#: ../lib/GUI/WORDS.pm:45 ../lib/GUI/WORDS.pm:92 +msgid "SSL Client, Email, Object Signing" +msgstr "SSL klient, Email, Podepisování objektů" + +#: ../lib/GUI/WORDS.pm:46 ../lib/GUI/WORDS.pm:93 +msgid "Object Signing CA" +msgstr "Podepisování objektů CA" + +#: ../lib/GUI/WORDS.pm:47 ../lib/GUI/WORDS.pm:94 +msgid "S/MIME CA" +msgstr "S/MIME CA" + +#: ../lib/GUI/WORDS.pm:48 ../lib/GUI/WORDS.pm:95 +msgid "SSL CA" +msgstr "SSL CA" + +#: ../lib/GUI/WORDS.pm:49 ../lib/GUI/WORDS.pm:96 +msgid "SSL CA, S/MIME CA" +msgstr "SSL CA, S/MIME CA" + +#: ../lib/GUI/WORDS.pm:50 ../lib/GUI/WORDS.pm:97 +msgid "SSL CA, Object Signing CA" +msgstr "SSL CA, Podepisování objektů CA" + +#: ../lib/GUI/WORDS.pm:51 ../lib/GUI/WORDS.pm:98 +msgid "S/MIME CA, Object Signing CA" +msgstr "S/MIME CA, Podepisování objektů CA" + +#: ../lib/GUI/WORDS.pm:52 ../lib/GUI/WORDS.pm:99 +msgid "SSL CA, S/MIME CA, Object Signing CA" +msgstr "SSL CA, S/MIME CA, Podepisování objektů CA" + +#: ../lib/GUI/WORDS.pm:53 ../lib/GUI/WORDS.pm:100 +msgid "Certificate Signing" +msgstr "Podepisování certifikátů" + +#: ../lib/GUI/WORDS.pm:54 ../lib/GUI/WORDS.pm:101 +msgid "CRL Signing" +msgstr "Podepisování CRL" + +#: ../lib/GUI/WORDS.pm:55 ../lib/GUI/WORDS.pm:102 +msgid "Certificate Signing, CRL Signing" +msgstr "Podepisování certifikátů, Podepisování CRL" + +#: ../lib/GUI/WORDS.pm:63 +msgid "Creation Date" +msgstr "Datum vytvoření" + +#: ../lib/GUI/WORDS.pm:66 +msgid "Public Key Algorithm" +msgstr "Algoritmus veřejného klíče" + +#: ../lib/GUI/WORDS.pm:67 +msgid "Signature Algorithm" +msgstr "Algoritmus podpisu" + +#: ../lib/GUI/WORDS.pm:71 ../lib/GUI/X509_infobox.pm:80 +msgid "Fingerprint (MD5)" +msgstr "Fingerprint (MD5)" + +#: ../lib/GUI/WORDS.pm:72 ../lib/GUI/X509_infobox.pm:89 +msgid "Fingerprint (SHA1)" +msgstr "Fingerprint (SHA1)" + +#: ../lib/GUI/X509_browser.pm:448 +msgid "Certificate Information" +msgstr "Informace certifikátu" + +#: ../lib/GUI/X509_browser.pm:452 +msgid "Request Information" +msgstr "Informace žádosti" + +#: ../lib/GUI/X509_browser.pm:571 +#, fuzzy +msgid "Invalid browser mode for selection_fname():" +msgstr "Neplatný mód prohlížeče pro selection_fname():" + +#: ../lib/GUI/X509_browser.pm:571 ../lib/GUI/X509_browser.pm:607 +#: ../lib/GUI/X509_browser.pm:656 ../lib/GUI/X509_browser.pm:677 +#: ../lib/GUI/X509_browser.pm:698 ../lib/GUI/X509_browser.pm:725 +msgid " " +msgstr " " + +#: ../lib/GUI/X509_browser.pm:607 +msgid "Invalid browser mode for selection_dn():" +msgstr "Neplatný mód prohlížeče pro selection_dn():" + +#: ../lib/GUI/X509_browser.pm:656 ../lib/GUI/X509_browser.pm:677 +msgid "Invalid browser mode for selection_cn():" +msgstr "Neplatný mód prohlížeče pro selection_cn():" + +#: ../lib/GUI/X509_browser.pm:698 +msgid "Invalid browser mode for selection_status():" +msgstr "Neplatný mód prohlížeče pro selection_status():" + +#: ../lib/GUI/X509_browser.pm:725 +#, fuzzy +msgid "Invalid browser mode for selection_type():" +msgstr "Neplatný mód prohlížeče pro selection_dn():" + +#: ../tinyca2:63 +#, c-format +msgid "Can't execute %s.\n" +msgstr "Nelze spustit %s.\n" + +#: ../tinyca2:64 +msgid "Configure correct path to openssl in tinyca.\n" +msgstr "Nastavte v tinyca správnou cestu k openssl.\n" + +#: ../tinyca2:69 +msgid "zip command not found, support disabled.\n" +msgstr "Příkaz zip nenalezen, podpora vypnuta.\n" + +#: ../tinyca2:70 +msgid "Configure correct path to zip in tinyca.\n" +msgstr "Nastavte v tinyca správnou cestu k zipu.\n" + +#: ../tinyca2:74 +#, fuzzy +msgid "tar command not found, support disabled.\n" +msgstr "Příkaz tar nenalezen, podpora vypnuta.\n" + +#: ../tinyca2:75 +#, fuzzy +msgid "Configure correct path to tar in tinyca.\n" +msgstr "Nastavte v tinyca správnou cestu k taru.\n" + +#: ../tinyca2:82 +msgid "Can't find templatedir.\n" +msgstr "Nelze najít templatedir.\n" + +#: ../tinyca2:83 +msgid "Please configure correct path with templates in tinyca.\n" +msgstr "Prosím, nastavte v tinyca správnou cestu k šablonám.\n" + +#~ msgid "Can't export PKCS#12 without passphrase" +#~ msgstr "Nelze exportovat do PKCS#12 bez fráze" diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..82b0cdb --- /dev/null +++ b/po/de.po @@ -0,0 +1,1980 @@ +# translation of de.po to +# translation of de.po to german +# This file is distributed under the same license as the tinyca package. +# Copyright (C) 2003-2006 Stephan Martin +# +msgid "" +msgstr "" +"Project-Id-Version: de\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-07-13 23:47+0200\n" +"PO-Revision-Date: 2006-02-18 23:02+0100\n" +"Last-Translator: Stephan Martin\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../lib/CA.pm:44 +msgid "error: can't open basedir: " +msgstr "Fehler beim Öffnen des Basisverzeichnisses: " + +#: ../lib/CA.pm:102 +msgid " Opening CA: " +msgstr " CA öffnen: " + +#: ../lib/CA.pm:109 ../lib/CA.pm:270 +msgid "Invalid CA selected" +msgstr "Die ausgewählte CA ist ungültig" + +#: ../lib/CA.pm:154 +msgid " Initializing OpenSSL" +msgstr " Initialisiere OpenSSL" + +#: ../lib/CA.pm:160 +msgid " Check for CA Version" +msgstr " Überprüfe die CA Version" + +#: ../lib/CA.pm:167 ../lib/CA.pm:195 +msgid "Can't open index file: " +msgstr "Fehler beim Lesen der Index-Datei: " + +#: ../lib/CA.pm:182 +msgid " Convert CA" +msgstr " Konvertiere CA" + +#: ../lib/CA.pm:201 +msgid "Can't open index backup: " +msgstr "Fehler beim Erstellen der Sicherungskopie: " + +#: ../lib/CA.pm:218 +msgid "This CA is converted for openssl 0.9.7x now." +msgstr "Diese CA wurde jetzt für openssl 0.9.7x konvertiert." + +#: ../lib/CA.pm:220 +msgid "You will find a backup copy of the index file at: " +msgstr "Eine Sicherung der Index-Datei wurde erstellt unter: " + +#: ../lib/CA.pm:229 +msgid " Read Configuration" +msgstr " Konfiguration einlesen" + +#: ../lib/CA.pm:235 +msgid " Create GUI" +msgstr " Erstelle GUI" + +#: ../lib/CA.pm:241 +msgid " Create Toolbar" +msgstr " Erstelle Toolbar" + +#: ../lib/CA.pm:247 +msgid " Actual CA: " +msgstr " Aktuelle CA: " + +#: ../lib/CA.pm:332 +#, c-format +msgid "CA: %s deleted" +msgstr "Die CA %s wurde erfolgreich gelöscht" + +#: ../lib/CA.pm:386 +msgid "Password of parent CA is needed for creating a Sub CA" +msgstr "" +"Das Passwort der zertifizierenden CA wird für die Erstellung der Sub CA " +"benötigt" + +#: ../lib/CA.pm:395 +msgid "Name must be filled in and must" +msgstr "Der Name muss eingetragen werden und darf" + +#: ../lib/CA.pm:396 +msgid " not contain Spaces" +msgstr " keine Leerzeichen enthalten" + +#: ../lib/CA.pm:408 +msgid "Please specify at least Common Name, " +msgstr "Bitte geben Sie mindestens einen allgemeinen Namen," + +#: ../lib/CA.pm:409 +msgid "Country and Password" +msgstr "Land und Passwort an" + +#: ../lib/CA.pm:416 ../lib/REQ.pm:109 +msgid "Passwords don't match" +msgstr "Die Passwörter stimmen nicht überein" + +#: ../lib/CA.pm:424 ../lib/REQ.pm:120 +msgid "Country must be exact 2 letter code" +msgstr "Das Land muss als 2 Buchstaben Code angegeben werden" + +#: ../lib/CA.pm:428 +#, c-format +msgid "CA: %s already exists" +msgstr "Eine CA mit Namen: %s existiert bereits" + +#: ../lib/CA.pm:468 +msgid "Name for storage must be filled in and must not contain spaces" +msgstr "" +"Der Name für die lokale Speicherung muß eingetragen werden und darf keine " +"Leerzeichen enthalten" + +#: ../lib/CA.pm:477 +msgid "You didn't give a password for the private CA key." +msgstr "Es wurde kein Passwort für den privaten CA Schlüssel angegeben." + +#: ../lib/CA.pm:479 +msgid "The import will fail, if the key is encrypted." +msgstr "" +"Der Importvorgang wird fehlschlagen, falls der Schlüssel verschlüsselt ist." + +#: ../lib/CA.pm:488 +msgid "Please give a new password for the CA" +msgstr "Bitte geben Sie ein neues CA Passwort an" + +#: ../lib/CA.pm:495 +msgid "New passwords don't match" +msgstr "Die neuen Passwörter stimmen nicht überein" + +#: ../lib/CA.pm:503 +msgid "Please give a CA certificate to import" +msgstr "CA Zertifikat zum Import auswählen" + +#: ../lib/CA.pm:508 +#, c-format +msgid "" +"Can't read CA certificate file:\n" +"%s" +msgstr "" +"Fehler beim Einlesen der CA Zertifikats-Datei:\n" +"%s" + +#: ../lib/CA.pm:518 +msgid "Please give a CA keyfile to import" +msgstr "CA Schlüsseldatei zum Import auswählen" + +#: ../lib/CA.pm:523 +#, c-format +msgid "" +"Can't read CA key file:\n" +"%s" +msgstr "" +"Fehler beim Lesen der CA Schlüssel-Datei:\n" +"%s" + +#: ../lib/CA.pm:535 +msgid "Please give an Index file to import.\n" +msgstr "Index Datei zum Import auswählen.\n" + +#: ../lib/CA.pm:536 +msgid "If you don't have an Index file, i'll try to generate one.\n" +msgstr "" +"Falls keine Index Datei angegeben ist, wird versucht eine zu erstellen.\n" + +#: ../lib/CA.pm:537 +msgid "Attention: This will cause all Certificates to show up as valid.\n" +msgstr "Achtung: Dadurch werden alle Zertifikate als gültig angezeigt.\n" + +#: ../lib/CA.pm:538 +msgid "Attention: Revoked Certificates will not be determined." +msgstr "Achtung: Widerrufene Zertifikate werden nicht erkannt." + +#: ../lib/CA.pm:549 +#, c-format +msgid "" +"Can't read Index file:\n" +"%s" +msgstr "" +"Fehler beim Einlesen der Index-Datei:\n" +"%s" + +#: ../lib/CA.pm:562 +msgid "Please give a directory containing the certificates to import" +msgstr "Verzeichnis mit Zertifikaten auswählen" + +#: ../lib/CA.pm:567 +#, c-format +msgid "" +"Can't find certificate directory:\n" +"%s" +msgstr "" +"Verzeichnis mit Zertifikaten nicht gefunden:\n" +"%s" + +#: ../lib/CA.pm:578 +#, c-format +msgid "CA: %s already exists. Please choose another name" +msgstr "" +"Eine CA mit Namen: %s existiert bereits. Bitte wählen Sie einen anderen Namen" + +#: ../lib/CA.pm:594 +msgid "Can't find X509v3 Basic Constraints in CA Certificate\n" +msgstr "X509v3 Erweiterung Basic Constraints nicht in CA Zertifikat gefunden\n" + +#: ../lib/CA.pm:595 +msgid "Import canceled" +msgstr "Import abgebrochen" + +#: ../lib/CA.pm:601 +msgid "The selected CA Certificate is no valid CA certificate\n" +msgstr "Das gewählte Zertifikat ist kein gültiges CA Zertifikat\n" + +#: ../lib/CA.pm:602 +#, c-format +msgid "X509v3 Basic Constraint is set to: %s" +msgstr "Die X509v3 Erweiterung Basic Constraints ist gesetzt auf: %s" + +#: ../lib/CA.pm:612 +#, c-format +msgid "" +"Can't open Index file:\n" +"%s" +msgstr "" +"Fehler beim Lesen der Index-Datei:\n" +"%s" + +#: ../lib/CA.pm:665 ../lib/CERT.pm:61 +#, c-format +msgid "Can't open Certificate directory: %s" +msgstr "Fehler beim Öffnen des Verzeichnis mit Zertifikaten: %s" + +#: ../lib/CA.pm:684 ../lib/CERT.pm:84 +#, c-format +msgid " Read Certificate: %s" +msgstr " Lese Zertifikat: %s" + +#: ../lib/CA.pm:694 +#, c-format +msgid "Can't read Certificate file: %s" +msgstr "Fehler beim Einlesen der Zertifikats-Datei: %s" + +#: ../lib/CA.pm:718 +#, c-format +msgid "Can't write Certificate file: %s" +msgstr "Fehler beim Schreiben der Zertifikats-Datei: %s" + +#: ../lib/CA.pm:768 ../lib/CA.pm:927 +msgid "Can't open Index file: " +msgstr "Fehler beim Lesen der Index-Datei: " + +#: ../lib/CA.pm:780 +#, c-format +msgid "Can't write CA Certificate file: %s" +msgstr "Fehler beim Schreiben der CA Zertifikats-Datei: %s" + +#: ../lib/CA.pm:800 ../lib/CA.pm:934 +msgid "Can't write Serial file: " +msgstr "Fehler beim Schreiben der Seriennummer: " + +#: ../lib/CA.pm:814 +#, c-format +msgid "Can't write CA Key file: %s" +msgstr "Fehler beim Schreiben der CA Schlüssel Datei: %s" + +#: ../lib/CA.pm:831 ../lib/CA.pm:1155 +msgid "Generating CRL failed" +msgstr "Fehler beim Erstellen der Widerrufsliste" + +#: ../lib/CA.pm:844 +#, c-format +msgid "Succesfully imported %d certificates\n" +msgstr "%d Zertifikate wurden erfolgreich importiert\n" + +#: ../lib/CA.pm:845 +msgid "Check the configuration of your imported CA." +msgstr "Überprüfen Sie bitte die Konfiguration der importierten CA" + +#: ../lib/CA.pm:862 ../lib/CA.pm:971 +msgid "No CA name given" +msgstr "Es wurde kein CA Name übergeben" + +#: ../lib/CA.pm:871 ../lib/CA.pm:876 ../lib/CA.pm:881 ../lib/CA.pm:886 +#: ../lib/CA.pm:891 ../lib/CA.pm:896 +msgid "Can't create directory: " +msgstr "Fehler beim Erstellen des Verzeichnisses: " + +#: ../lib/CA.pm:905 +#, c-format +msgid "Can't open template file %s %s" +msgstr "Fehler beim Öffnen der Vorlagen-Datei %s: %s" + +#: ../lib/CA.pm:910 ../lib/CA.pm:1207 ../lib/CA.pm:1274 ../lib/CERT.pm:637 +#: ../lib/KEY.pm:227 ../lib/REQ.pm:740 +#, c-format +msgid "Can't open output file: %s: %s" +msgstr "Fehler beim Öffnen der Ausgabe-Datei %s: %s" + +#: ../lib/CA.pm:984 ../lib/KEY.pm:482 ../lib/REQ.pm:167 +msgid "Generating key failed" +msgstr "Fehler beim Erstellen des Schlüssels" + +#: ../lib/CA.pm:1018 ../lib/REQ.pm:193 +msgid "Generating Request failed" +msgstr "Fehler beim Erstellen der Anforderung" + +#: ../lib/CA.pm:1027 ../lib/CA.pm:1041 ../lib/CERT.pm:102 +msgid "Can't read Certificate" +msgstr "Das Zertifikat kann nicht eingelesen werden" + +#: ../lib/CA.pm:1032 ../lib/CA.pm:1046 +msgid "Can't write Certificate" +msgstr "Fehler beim Schreiben der Zertifikats-Datei" + +#: ../lib/CA.pm:1086 +msgid "Generating certificate failed" +msgstr "Fehler beim erstellen des Zertifikats" + +#: ../lib/CA.pm:1106 ../lib/CA.pm:1131 +#, c-format +msgid "Can't open ca certificate file %s %s" +msgstr "Fehler beim Öffnen der Zertifikats Datei %s: %s" + +#: ../lib/CA.pm:1115 +#, c-format +msgid "Can't create certificate chain file: %s: %s" +msgstr "Fehler beim Erstellen der Datei für die Zertifikatskette: %s: %s" + +#: ../lib/CA.pm:1164 +#, c-format +msgid "CA: %s created" +msgstr "Die CA %s wurde erfolgreich erstellt" + +#: ../lib/CA.pm:1199 +#, c-format +msgid "Can't open certificate chain file: %s: %s" +msgstr "Fehler beim Öffnen der -Datei mit der Zertifikatskette %s: %s" + +#: ../lib/CA.pm:1220 +#, c-format +msgid "Certificate Chain succesfully exported to: %s" +msgstr "Die Zertifikatskette wurden erfolgreich nach %s exportiert" + +#: ../lib/CA.pm:1255 ../lib/CERT.pm:580 ../lib/GUI.pm:166 ../lib/KEY.pm:348 +#: ../lib/REQ.pm:71 ../lib/REQ.pm:389 +msgid "Can't read CA certificate" +msgstr "Fehler beim Einlesen des CA Zertifikats" + +#: ../lib/CA.pm:1265 +#, c-format +msgid "Invalid Format for export_ca_cert(): %s" +msgstr "Ungültiges Format für den Export in export_ca_cert(): %s" + +#: ../lib/CA.pm:1287 +#, c-format +msgid "Certificate succesfully exported to: %s" +msgstr "Das Zertifikat wurden erfolgreich nach %s exportiert" + +#: ../lib/CA.pm:1320 +msgid "Please give the output file" +msgstr "Bitte Ausgabedatei angeben" + +#: ../lib/CA.pm:1328 +msgid "Please give the CA password to create the Revocation List" +msgstr "Bitte geben Sie das CA Passwort an um die Widerrufsliste zu erstellen" + +#: ../lib/CA.pm:1349 +msgid "" +"Wrong CA password given\n" +"Generating Revocation List failed" +msgstr "" +"Sie haben ein falsches CA PAsswort angegeben\n" +"Fehler bei der Erstellung der Widerrufsliste" + +#: ../lib/CA.pm:1353 +msgid "" +"CA Key not found\n" +"Generating Revocation List failed" +msgstr "" +"CA Schlüssel nicht gefunden\n" +"Fehler bei der Erstellung der Widerrufsliste" + +#: ../lib/CA.pm:1357 ../lib/CA.pm:1363 +msgid "Generating Revocation List failed" +msgstr "Fehler bei der Erstellung der Widerrufsliste" + +#: ../lib/CA.pm:1371 +#, c-format +msgid "CRL successfully exported to: %s" +msgstr "Die Widerrufsliste wurde erfolgreich nach %s exportiert" + +#: ../lib/CERT.pm:143 ../lib/CERT.pm:199 ../lib/CERT.pm:322 ../lib/CERT.pm:381 +#: ../lib/GUI.pm:851 +msgid "Please select a Certificate first" +msgstr "Bitte erst ein Zertifikat auswählen" + +#: ../lib/CERT.pm:151 ../lib/CERT.pm:209 ../lib/CERT.pm:333 ../lib/CERT.pm:400 +#: ../lib/GUI.pm:2706 ../lib/GUI.pm:2717 ../lib/OpenSSL.pm:702 +#: ../lib/GUI/X509_browser.pm:276 +msgid "VALID" +msgstr "GÜLTIG" + +#: ../lib/CERT.pm:153 +#, c-format +msgid "" +"Can't renew Certifikate with Status: %s\n" +"Please revoke the Certificate first" +msgstr "" +"Ein Zertifikat mit Status %s kann nicht erneuert werden\n" +"Bitte widerrufen Sie das Zertifikat vorher" + +#: ../lib/CERT.pm:168 +msgid "" +"Key and Request are necessary for renewal of a Certificate\n" +"Renewal is not possible!" +msgstr "" +"Für die Erneuernung des Zertifikats werden Schlüssel und Anforderung " +"benötigt\n" +"Die Erneuerung ist nicht möglich!" + +#: ../lib/CERT.pm:210 +#, c-format +msgid "Can't revoke Certifikate with Status: %s" +msgstr "Ein Zertifikat mit dem Status %s kann nicht widerrufen werden" + +#: ../lib/CERT.pm:256 +msgid "" +"Wrong CA password given\n" +"Revoking the Certificate failed" +msgstr "" +"Sie haben ein falsches CA Passwort angegeben\n" +"Fehler beim Widerruf des Zertifikats" + +#: ../lib/CERT.pm:263 +msgid "" +"CA Key not found\n" +"Revoking the Certificate failed" +msgstr "" +"CA Schlüssel nicht gefunden\n" +"Fehler beim Widerruf des Zertifikats" + +#: ../lib/CERT.pm:270 +msgid "Revoking the Certificate failed" +msgstr "Fehler beim Widerruf des Zertifikats" + +#: ../lib/CERT.pm:290 +msgid "Generating a new Revocation List failed" +msgstr "Fehler beim Erstellen der neuen Widerrufliste" + +#: ../lib/CERT.pm:335 +msgid "" +"Can't delete VALID certificate!\n" +"Please revoke the Certificate first." +msgstr "" +"Ein Zertifikat mit Status GÜLTIG kann nicht gelöscht werden!\n" +"Bitte widerrufen Sie vorher das Zertifikat." + +#: ../lib/CERT.pm:401 +msgid "Certificate seems not to be VALID" +msgstr "Das Zertifikat ist nicht GÜLTIG" + +#: ../lib/CERT.pm:403 +msgid "Export is not possible" +msgstr "Ein Export ist nicht möglich" + +#: ../lib/CERT.pm:430 ../lib/KEY.pm:172 +msgid "Please give at least the output file" +msgstr "Bitte geben Sie mindestens die Ausgabedatei an" + +#: ../lib/CERT.pm:436 +msgid "Key is necessary for export as PKCS#12" +msgstr "Für den Export als PKCS#12 wird ein Schlüssel benötigt" + +#: ../lib/CERT.pm:438 ../lib/CERT.pm:454 ../lib/KEY.pm:257 ../lib/KEY.pm:308 +msgid "Export is not possible!" +msgstr "Ein Export ist nicht möglich!" + +#: ../lib/CERT.pm:452 +#, c-format +msgid "Key is necessary for export as %s" +msgstr "Für den Export als %s wird ein Schlüssel benötigt" + +#: ../lib/CERT.pm:492 ../lib/KEY.pm:216 +#, c-format +msgid "Can't open Certificate file: %s: %s" +msgstr "Fehler beim Öffnen der Zertifikats Datei %s: %s " + +#: ../lib/CERT.pm:525 ../lib/KEY.pm:288 +msgid "Generating PKCS#12 failed" +msgstr "Fehler beim Erstellen der PKCS#12-Datei" + +#: ../lib/CERT.pm:533 ../lib/CERT.pm:616 ../lib/KEY.pm:295 ../lib/KEY.pm:381 +#, c-format +msgid "Certificate and Key successfully exported to %s" +msgstr "Zertifikat und Schlüssel wurden erfolgreich nach %s exportiert" + +#: ../lib/CERT.pm:546 ../lib/CERT.pm:567 ../lib/REQ.pm:693 +#, c-format +msgid "Can't create temporary file: %s: %s" +msgstr "Fehler beim Erstellen der temporären Datei: %s: %s" + +#: ../lib/CERT.pm:558 +#, c-format +msgid "Can't read Key file: %s: %s" +msgstr "Fehler beim Öffnen der Schlüssel-Datei %s: %s" + +#: ../lib/CERT.pm:588 ../lib/KEY.pm:321 ../lib/KEY.pm:337 ../lib/KEY.pm:355 +msgid "Can't create temporary file" +msgstr "Fehler beim Erstellen einer temporären Datei" + +#: ../lib/CERT.pm:609 ../lib/KEY.pm:375 +#, c-format +msgid "Generating %s file failed" +msgstr "Fehler beim Erzeugen der %s-Datei" + +#: ../lib/CERT.pm:628 +#, c-format +msgid "Invalid Format for export_cert(): %s" +msgstr "Ungültiges Format für export_cert(): %s" + +#: ../lib/CERT.pm:648 +#, c-format +msgid "Certificate successfully exported to: %s" +msgstr "Das Zertifikat wurde erfolgreich nach %s exportiert" + +#: ../lib/GUI.pm:171 ../lib/GUI.pm:178 +msgid "CA" +msgstr "CA" + +#: ../lib/GUI.pm:185 +msgid "CA Information" +msgstr "Informationen über die CA" + +#: ../lib/GUI.pm:204 +msgid "Certificates" +msgstr "Zertifikate" + +#: ../lib/GUI.pm:244 ../lib/GUI.pm:2689 ../lib/GUI/WORDS.pm:56 +#: ../lib/GUI/X509_browser.pm:160 ../lib/GUI/X509_browser.pm:168 +#: ../lib/GUI/X509_browser.pm:177 +msgid "Common Name" +msgstr "Allgemeiner Name" + +#: ../lib/GUI.pm:245 ../lib/GUI.pm:1273 ../lib/GUI.pm:2314 +#: ../lib/GUI/WORDS.pm:57 ../lib/GUI/X509_browser.pm:161 +#: ../lib/GUI/X509_browser.pm:169 ../lib/GUI/X509_browser.pm:178 +msgid "eMail Address" +msgstr "eMail Adresse" + +#: ../lib/GUI.pm:246 ../lib/GUI/WORDS.pm:59 ../lib/GUI/X509_browser.pm:162 +#: ../lib/GUI/X509_browser.pm:170 ../lib/GUI/X509_browser.pm:179 +msgid "Organizational Unit" +msgstr "Organisationseinheit" + +#: ../lib/GUI.pm:247 ../lib/GUI/WORDS.pm:58 ../lib/GUI/X509_browser.pm:163 +#: ../lib/GUI/X509_browser.pm:171 ../lib/GUI/X509_browser.pm:180 +msgid "Organization" +msgstr "Organisation" + +#: ../lib/GUI.pm:248 ../lib/GUI/WORDS.pm:60 ../lib/GUI/X509_browser.pm:164 +#: ../lib/GUI/X509_browser.pm:172 ../lib/GUI/X509_browser.pm:181 +msgid "Location" +msgstr "Standort" + +#: ../lib/GUI.pm:249 ../lib/GUI/WORDS.pm:61 ../lib/GUI/X509_browser.pm:165 +#: ../lib/GUI/X509_browser.pm:173 ../lib/GUI/X509_browser.pm:182 +msgid "State" +msgstr "Bundesstaat" + +#: ../lib/GUI.pm:250 ../lib/GUI/WORDS.pm:62 ../lib/GUI/X509_browser.pm:166 +#: ../lib/GUI/X509_browser.pm:174 ../lib/GUI/X509_browser.pm:183 +msgid "Country" +msgstr "Land" + +#: ../lib/GUI.pm:251 ../lib/GUI/WORDS.pm:68 ../lib/GUI/X509_browser.pm:184 +msgid "Type" +msgstr "Typ" + +#: ../lib/GUI.pm:265 +msgid "Keys" +msgstr "Schlüssel" + +#: ../lib/GUI.pm:308 +msgid "Requests" +msgstr "Anforderungen" + +#: ../lib/GUI.pm:399 +#, c-format +msgid " Actual CA: %s" +msgstr " Aktuelle CA: %s" + +#: ../lib/GUI.pm:402 +#, c-format +msgid " Actual CA: %s - Certificates" +msgstr " Aktuelle CA: %s - Zertifikate" + +#: ../lib/GUI.pm:405 +#, c-format +msgid " Actual CA: %s - Keys" +msgstr " Aktuelle CA: %s - Schlüssel" + +#: ../lib/GUI.pm:408 +#, c-format +msgid " Actual CA: %s - Requests" +msgstr " Aktuelle CA: %s - Anforderungen" + +#: ../lib/GUI.pm:457 ../lib/GUI.pm:1141 +msgid "Open CA" +msgstr "CA öffnen" + +#: ../lib/GUI.pm:463 +msgid "New CA" +msgstr "CA erstellen" + +#: ../lib/GUI.pm:469 ../lib/GUI.pm:2382 +msgid "Import CA" +msgstr "CA Importieren" + +#: ../lib/GUI.pm:475 ../lib/GUI.pm:1143 +msgid "Delete CA" +msgstr "CA löschen" + +#: ../lib/GUI.pm:485 ../lib/GUI.pm:524 ../lib/GUI.pm:592 +msgid "Details" +msgstr "Details" + +#: ../lib/GUI.pm:491 +msgid "History" +msgstr "Verlauf" + +#: ../lib/GUI.pm:497 +msgid "Sub CA" +msgstr "Sub CA" + +#: ../lib/GUI.pm:503 +msgid "Export CA" +msgstr "CA Exportieren" + +#: ../lib/GUI.pm:509 ../lib/GUI.pm:1419 +msgid "Export CRL" +msgstr "CRL Exportieren" + +#: ../lib/GUI.pm:516 +msgid "Export Chain" +msgstr "Kette Exportieren" + +#: ../lib/GUI.pm:530 ../lib/GUI.pm:598 +msgid "View" +msgstr "Anzeigen" + +#: ../lib/GUI.pm:540 ../lib/GUI.pm:604 +msgid "New" +msgstr "Neu" + +#: ../lib/GUI.pm:547 ../lib/GUI.pm:578 +msgid "Export" +msgstr "Exportieren" + +#: ../lib/GUI.pm:553 +msgid "Revoke" +msgstr "Widerrufen" + +#: ../lib/GUI.pm:563 +msgid "Renew" +msgstr "Erneuern" + +#: ../lib/GUI.pm:570 ../lib/GUI.pm:584 ../lib/GUI.pm:627 +msgid "Delete" +msgstr "Löschen" + +#: ../lib/GUI.pm:610 +msgid "Import" +msgstr "Importieren" + +#: ../lib/GUI.pm:620 +msgid "Sign" +msgstr "Signieren" + +#: ../lib/GUI.pm:646 +msgid "_CA" +msgstr "_CA" + +#: ../lib/GUI.pm:649 +msgid "_Open CA" +msgstr "CA _öffnen" + +#: ../lib/GUI.pm:654 +msgid "_New CA" +msgstr "_Neue CA erstellen" + +#: ../lib/GUI.pm:659 +msgid "_Delete CA" +msgstr "CA _löschen" + +#: ../lib/GUI.pm:667 +msgid "_Exit" +msgstr "_Beenden" + +#: ../lib/GUI.pm:674 +msgid "_Preferences" +msgstr "_Einstellungen" + +#: ../lib/GUI.pm:677 +msgid "Experts Only!!" +msgstr "Nur für Experten!!" + +#: ../lib/GUI.pm:682 +msgid "OpenSSL _Configuration" +msgstr "OpenSSL _Konfiguration" + +#: ../lib/GUI.pm:689 ../lib/GUI.pm:692 +msgid "_Help" +msgstr "_Hilfe" + +#: ../lib/GUI.pm:697 +msgid "_About TinyCA" +msgstr "Über _TinyCA" + +#: ../lib/GUI.pm:728 +msgid "Invalid mode for show_text():" +msgstr "Ungültiger Modus für show_text():" + +#: ../lib/GUI.pm:733 ../lib/GUI.pm:848 ../lib/REQ.pm:236 ../lib/REQ.pm:367 +msgid "Please select a Request first" +msgstr "Bitte erst eine Anforderung auswählen" + +#: ../lib/GUI.pm:736 +msgid "Please select a certificate first" +msgstr "Bitte erst ein Zertifikat auswählen" + +#: ../lib/GUI.pm:752 ../lib/GUI.pm:867 ../lib/GUI/X509_browser.pm:456 +#: ../lib/GUI/X509_browser.pm:515 +msgid "Can't read file" +msgstr "Fehler beim Lesen der Datei" + +#: ../lib/GUI.pm:754 +msgid "Request" +msgstr "Anforderung" + +#: ../lib/GUI.pm:754 +msgid "Certificate" +msgstr "Zertifikat" + +#: ../lib/GUI.pm:815 +#, c-format +msgid "Invalid mode for _show_popup_menu(): %s" +msgstr "Ungültiger Modus für show_popup_menu(): %s" + +#: ../lib/GUI.pm:843 +msgid "Invalid mode for show_details():" +msgstr "Ungültiger Modus für show_details()" + +#: ../lib/GUI.pm:869 ../lib/GUI.pm:969 ../lib/GUI.pm:3040 +msgid "Request Details" +msgstr "Anforderungs Details" + +#: ../lib/GUI.pm:869 ../lib/GUI.pm:969 ../lib/GUI.pm:2897 +msgid "Certificate Details" +msgstr "Zertifikat Details" + +#: ../lib/GUI.pm:911 ../lib/GUI.pm:1679 ../lib/GUI.pm:3061 +msgid "Import Request" +msgstr "Importiere Anforderung" + +#: ../lib/GUI.pm:913 ../lib/GUI.pm:2438 +msgid "Import CA Certificate" +msgstr "CA Zertifikat Importieren" + +#: ../lib/GUI.pm:921 +msgid "Do you want to import the following Certificate Request?" +msgstr "Wollen Sie folgende Zertifikats Anforderung wirklich importieren?" + +#: ../lib/GUI.pm:923 +msgid "Do you want to import the following CA Certificate?" +msgstr "Wollen Sie das folgende CA Zertifikat wirklich importieren?" + +#: ../lib/GUI.pm:977 +msgid "Subject DN" +msgstr "Subject DN" + +#: ../lib/GUI.pm:1001 +msgid "Issuer" +msgstr "Aussteller" + +#: ../lib/GUI.pm:1027 +msgid "Validity" +msgstr "Gültigkeit" + +#: ../lib/GUI.pm:1043 +msgid "Key/Request Details:" +msgstr "Schlüssel/Anforderungs Details:" + +#: ../lib/GUI.pm:1043 +msgid "Key/Certificate Details:" +msgstr "Schlüssel/Zertifikats Details:" + +#: ../lib/GUI.pm:1059 +msgid "Fingerprints" +msgstr "Fingerabdrücke" + +#: ../lib/GUI.pm:1075 +msgid "Requested X.509 Extensions" +msgstr "Folgende X.509v3 Erweiterungen werden angefordert" + +#: ../lib/GUI.pm:1075 +msgid "X.509v3 Extensions" +msgstr "X.509v3 Erweiterungen" + +#: ../lib/GUI.pm:1100 +msgid "Requested Netscape Extensions" +msgstr "Angeforderte Netscape Erweiterungen" + +#: ../lib/GUI.pm:1100 +msgid "Netscape Extensions" +msgstr "Netscape-Erweiterungen" + +#: ../lib/GUI.pm:1145 +msgid "Invalid action given: " +msgstr "Ungültiges Aktion: " + +#: ../lib/GUI.pm:1167 ../lib/GUI.pm:1213 +msgid "Invalid action for show_select_ca_dialog(): " +msgstr "Ungültige Aktion für show_select_ca_dialog(): " + +#: ../lib/GUI.pm:1189 +msgid "Available CAs" +msgstr "Verfügbare CAs" + +#: ../lib/GUI.pm:1245 +msgid "Create Request" +msgstr "Erstelle Anforderung" + +#: ../lib/GUI.pm:1246 +msgid "Create a new Certificate Request" +msgstr "Erstellen einer neuen Zertifikats Anforderung" + +#: ../lib/GUI.pm:1260 +msgid "Common Name (eg, your Name," +msgstr "Comon Name (z.B. Ihr Name," + +#: ../lib/GUI.pm:1265 +msgid "your eMail Address" +msgstr "Ihre eMail Adresse" + +#: ../lib/GUI.pm:1269 +msgid "or the Servers Name)" +msgstr "oder der Name des Servers)" + +#: ../lib/GUI.pm:1277 +msgid "Password (protect your private Key):" +msgstr "Passwort (sichert den privaten Schlüssel):" + +#: ../lib/GUI.pm:1281 ../lib/GUI.pm:2294 +msgid "Password (confirmation):" +msgstr "Passwort (Bestätigung):" + +#: ../lib/GUI.pm:1285 ../lib/GUI.pm:2286 +msgid "Country Name (2 letter code):" +msgstr "Land (2 Buchstaben-Code)" + +#: ../lib/GUI.pm:1289 ../lib/GUI.pm:2298 +msgid "State or Province Name:" +msgstr "Bundesstaat oder Provinz:" + +#: ../lib/GUI.pm:1293 ../lib/GUI.pm:2302 +msgid "Locality Name (eg. city):" +msgstr "Standort (z.B. Stadt):" + +#: ../lib/GUI.pm:1297 ../lib/GUI.pm:2306 +msgid "Organization Name (eg. company):" +msgstr "Organisation (z.B. Firma):" + +#: ../lib/GUI.pm:1303 ../lib/GUI.pm:1308 ../lib/GUI.pm:2310 +msgid "Organizational Unit Name (eg. section):" +msgstr "Organisationseinheit (z.B. Abteilung):" + +#: ../lib/GUI.pm:1313 ../lib/GUI.pm:2322 ../lib/GUI/WORDS.pm:65 +msgid "Keylength" +msgstr "Schlüssellänge" + +#: ../lib/GUI.pm:1321 ../lib/GUI.pm:2352 +msgid "Digest" +msgstr "Digest" + +#: ../lib/GUI.pm:1328 +msgid "Algorithm" +msgstr "Algorithmus" + +#: ../lib/GUI.pm:1359 ../lib/GUI.pm:2918 +msgid "Revoke Certificate" +msgstr "Widerrufe Zertifikat" + +#: ../lib/GUI.pm:1368 ../lib/GUI.pm:1444 ../lib/GUI.pm:2093 +msgid "CA Password:" +msgstr "CA Passwort:" + +#: ../lib/GUI.pm:1374 +msgid "Revocation Reason:" +msgstr "Grund des Widerrufs:" + +#: ../lib/GUI.pm:1419 +msgid "Export Revocation List to File" +msgstr "Widerrufsliste in Datei exportieren" + +#: ../lib/GUI.pm:1427 ../lib/GUI.pm:1515 ../lib/GUI.pm:1563 ../lib/GUI.pm:1687 +#: ../lib/GUI.pm:1755 +msgid "File:" +msgstr "Datei:" + +#: ../lib/GUI.pm:1438 ../lib/GUI.pm:1526 ../lib/GUI.pm:1574 ../lib/GUI.pm:1697 +#: ../lib/GUI.pm:1772 ../lib/GUI.pm:2435 ../lib/GUI.pm:2454 ../lib/GUI.pm:2473 +#: ../lib/GUI.pm:2492 +msgid "Browse..." +msgstr "Auswählen..." + +#: ../lib/GUI.pm:1441 ../lib/GUI.pm:1554 ../lib/GUI.pm:1577 +msgid "Export CA Certificate" +msgstr "CA Zertifikat Exportieren" + +#: ../lib/GUI.pm:1448 ../lib/GUI.pm:2099 ../lib/GUI.pm:2318 +msgid "Valid for (Days):" +msgstr "Gültigkeit (in Tagen):" + +#: ../lib/GUI.pm:1452 ../lib/GUI.pm:1581 ../lib/GUI.pm:1779 +msgid "Export Format:" +msgstr "Export Format:" + +#: ../lib/GUI.pm:1458 ../lib/GUI.pm:1587 +msgid "PEM" +msgstr "PEM" + +#: ../lib/GUI.pm:1467 ../lib/GUI.pm:1596 +msgid "DER" +msgstr "DER" + +#: ../lib/GUI.pm:1476 ../lib/GUI.pm:1605 +msgid "TXT" +msgstr "TXT" + +#: ../lib/GUI.pm:1507 ../lib/GUI.pm:1529 +msgid "Export CA Certificate Chain" +msgstr "Exportiere Zertifikatskette" + +#: ../lib/GUI.pm:1508 +msgid "Export CA Certificate Chain to File" +msgstr "Zertifikatskette in Datei exportieren" + +#: ../lib/GUI.pm:1555 +msgid "Export CA Certificate to File" +msgstr "CA Zertifikat in Datei exportieren" + +#: ../lib/GUI.pm:1635 ../lib/GUI.pm:1636 +msgid "Export Key without Passphrase" +msgstr "Schlüssel ohne Passwort exportieren" + +#: ../lib/GUI.pm:1640 +msgid "I hope you know what you're doing?" +msgstr "Ich hoffe Sie wissen was Sie tun?" + +#: ../lib/GUI.pm:1644 +msgid "The Key Passphrase is needed for decryption of the Key" +msgstr "Das Schlüssel Passwort wird zur Entschlüsselung benötigt" + +#: ../lib/GUI.pm:1653 +msgid "Password:" +msgstr "Passwort:" + +#: ../lib/GUI.pm:1679 ../lib/GUI.pm:1700 +msgid "Import Request from File" +msgstr "Importiere Anforderung aus Datei" + +#: ../lib/GUI.pm:1721 ../lib/GUI.pm:1759 ../lib/GUI.pm:2911 +msgid "Export Certificate" +msgstr "Zertifikat exportieren" + +#: ../lib/GUI.pm:1723 ../lib/GUI.pm:1761 ../lib/GUI.pm:2868 +msgid "Export Key" +msgstr "Schlüssel exportieren" + +#: ../lib/GUI.pm:1726 +msgid "Invalid mode for show_export_dialog(): " +msgstr "Ungültiger Modus für show_export_dialog():" + +#: ../lib/GUI.pm:1743 +msgid "Export Certificate to File" +msgstr "Zertifikat in Datei exportieren" + +#: ../lib/GUI.pm:1745 +msgid "Export Key to File" +msgstr "Schlüssel in Datei exportieren" + +#: ../lib/GUI.pm:1783 +msgid "PEM (Certificate)" +msgstr "PEM (Zertifikat)" + +#: ../lib/GUI.pm:1785 +msgid "PEM (Key)" +msgstr "PEM (Schlüssel)" + +#: ../lib/GUI.pm:1794 +msgid "DER (Certificate)" +msgstr "DER (Zertifikat)" + +#: ../lib/GUI.pm:1796 +msgid "DER (Key without Passphrase)" +msgstr "DER (Schlüssel ohne Passwort)" + +#: ../lib/GUI.pm:1804 +msgid "PKCS#12 (Certificate & Key)" +msgstr "PKCS#12 (Zertifikat & Schlüssel)" + +#: ../lib/GUI.pm:1811 +msgid "Zip (Certificate & Key)" +msgstr "Zip (Zertifikat & Schlüssel)" + +#: ../lib/GUI.pm:1821 +msgid "Tar (Certificate & Key)" +msgstr "Tar (Zertifikat & Schlüssel)" + +#: ../lib/GUI.pm:1833 +msgid "TXT (Certificate)" +msgstr "TXT (Zertifikat)" + +#: ../lib/GUI.pm:1839 +msgid "Without Passphrase (PEM/PKCS#12)" +msgstr "Ohne Passwort (PEM/PKCS#12)" + +#: ../lib/GUI.pm:1845 ../lib/GUI.pm:1872 ../lib/GUI.pm:1891 ../lib/GUI.pm:2018 +#: ../lib/GUI.pm:2043 ../lib/GUI.pm:2196 +msgid "Yes" +msgstr "Ja" + +#: ../lib/GUI.pm:1850 ../lib/GUI.pm:1877 ../lib/GUI.pm:1896 ../lib/GUI.pm:2024 +#: ../lib/GUI.pm:2049 ../lib/GUI.pm:2202 +msgid "No" +msgstr "Nein" + +#: ../lib/GUI.pm:1860 +msgid "Include Key (PEM)" +msgstr "Schlüssel hinzufügen (PEM)" + +#: ../lib/GUI.pm:1865 +msgid "Include Certificate (PEM)" +msgstr "Zertifikat hinzufügen (PEM)" + +#: ../lib/GUI.pm:1885 +msgid "Include Fingerprint (PEM)" +msgstr "Fingerabdruck hinzufügen (PEM)" + +#: ../lib/GUI.pm:1993 ../lib/GUI.pm:1994 +msgid "Export to PKCS#12" +msgstr "Export als PKCS#12" + +#: ../lib/GUI.pm:2001 +msgid "Key Password:" +msgstr "Schlüssel Passwort:" + +#: ../lib/GUI.pm:2005 +msgid "Export Password:" +msgstr "Export Passwort:" + +#: ../lib/GUI.pm:2008 +msgid "Friendly Name:" +msgstr "Anzeigename" + +#: ../lib/GUI.pm:2012 +msgid "Without Passphrase" +msgstr "Ohne Passwort" + +#: ../lib/GUI.pm:2037 +msgid "Add CA Certificate to PKCS#12 structure" +msgstr "CA Zertifikat zu PKCS#12 Struktur hinzufügen" + +#: ../lib/GUI.pm:2085 ../lib/GUI.pm:3068 +msgid "Sign Request" +msgstr "Signiere Anforderung" + +#: ../lib/GUI.pm:2085 +msgid "Sign Request/Create Certificate" +msgstr "Signiere die Anforderung/Erstelle ein Zertifikat" + +#: ../lib/GUI.pm:2110 ../lib/GUI.pm:2155 +msgid "Subject alternative name (IP Address):" +msgstr "Subject Alternative Name (IP Adresse):" + +#: ../lib/GUI.pm:2113 ../lib/GUI.pm:2158 +msgid "Subject alternative name (DNS Name):" +msgstr "Subject Alternative Name (DNS Name):" + +#: ../lib/GUI.pm:2116 ../lib/GUI.pm:2164 +msgid "Subject alternative name (raw):" +msgstr "Subject Alternative Name (raw):" + +#: ../lib/GUI.pm:2124 ../lib/GUI.pm:2172 +msgid "Extended Key Usage:" +msgstr "Verwendung des Schlüssels (erweitert):" + +#: ../lib/GUI.pm:2131 +msgid "Netscape SSL Server Name:" +msgstr "Netscape SSL Server Name:" + +#: ../lib/GUI.pm:2138 ../lib/GUI.pm:2179 +msgid "Netscape Revocation URL:" +msgstr "Netcape Widerrufs URL" + +#: ../lib/GUI.pm:2145 ../lib/GUI.pm:2186 +msgid "Netscape Renewal URL:" +msgstr "Netscape Erneuerungs URL:" + +#: ../lib/GUI.pm:2161 +msgid "Subject alternative name (eMail Address):" +msgstr "Subject Alternative Name (eMail Adresse):" + +#: ../lib/GUI.pm:2208 +msgid "Add eMail Address to Subject DN:" +msgstr "eMail Adresse zu Subject DN hinzufügen:" + +#: ../lib/GUI.pm:2238 ../lib/GUI.pm:2242 +msgid "Create CA" +msgstr "Erstelle CA" + +#: ../lib/GUI.pm:2238 +msgid "Create a new Sub CA" +msgstr "Erstellen einer neuen SubCA" + +#: ../lib/GUI.pm:2242 +msgid "Create a new CA" +msgstr "Neue CA erstellen" + +#: ../lib/GUI.pm:2255 +msgid "CA Password (for creating the new CA):" +msgstr "CA Passwort (für die Erstellung der neuen CA):" + +#: ../lib/GUI.pm:2266 ../lib/GUI.pm:2403 +msgid "Name (for local storage):" +msgstr "Name (für die lokale Speicherung):" + +#: ../lib/GUI.pm:2273 +msgid "Data for CA Certificate" +msgstr "Daten für das CA Zertifikat" + +#: ../lib/GUI.pm:2282 +msgid "Common Name (for the CA):" +msgstr "Common Name (für die CA):" + +#: ../lib/GUI.pm:2290 +msgid "Password (needed for signing):" +msgstr "Passwort (zum Signieren):" + +#: ../lib/GUI.pm:2382 +msgid "Import an existing CA into TinyCA" +msgstr "Bestehende CA in TinyCA importieren" + +#: ../lib/GUI.pm:2393 +msgid "Password of the private CA key (Needed for import):" +msgstr "Passwort des privaten Schlüssels (wird für den Import benötigt):" + +#: ../lib/GUI.pm:2407 +msgid "New password for the CA:" +msgstr "Neues CA Passwort:" + +#: ../lib/GUI.pm:2411 +msgid "Confirm password:" +msgstr "CA Passwort bestätigen:" + +#: ../lib/GUI.pm:2416 +msgid "Files/Directories to import" +msgstr "Dateien/Verzeichnisse zum Importieren" + +#: ../lib/GUI.pm:2424 +msgid "CA Certificate (PEM/DER):" +msgstr "CA Zertifikat (PEM/DER):" + +#: ../lib/GUI.pm:2443 +msgid "CA private key (PEM/DER):" +msgstr "Privater CA Schlüssel (PEM/DER):" + +#: ../lib/GUI.pm:2457 +msgid "Import CA private Key" +msgstr "Privaten CA Schlüssel importieren" + +#: ../lib/GUI.pm:2462 +msgid "OpenSSL Index File (index.txt):" +msgstr "OpenSSL Index Datei (index.txt):" + +#: ../lib/GUI.pm:2476 +msgid "Import Index File" +msgstr "Importiere Index Datei" + +#: ../lib/GUI.pm:2481 +msgid "Directory containing certificates (PEM/DER):" +msgstr "Verzeichnis mit Zertifikaten (PEM/DER):" + +#: ../lib/GUI.pm:2495 +msgid "Import Certificates from directory" +msgstr "Zertifikate aus Verzeichnis importieren" + +#: ../lib/GUI.pm:2509 +msgid "You are kidding, are you??" +msgstr "You are kidding, are you??" + +#: ../lib/GUI.pm:2531 +msgid "Spanish: Ramon Pons Vivanco " +msgstr "Spanisch: Ramon Pons Vivanco " + +#: ../lib/GUI.pm:2532 +msgid "Czech: Robert Wolf " +msgstr "Tschechisch: Robert Wolf " + +#: ../lib/GUI.pm:2533 +msgid "French: Thibault Le Meur " +msgstr "Französisch: Thibault Le Meur " + +#: ../lib/GUI.pm:2549 +msgid "Do you really want to delete the selected Request?" +msgstr "Wollen Sie die ausgewählte Anforderung wirklich löschen?" + +#: ../lib/GUI.pm:2551 +msgid "Do you really want to delete the selected Key?" +msgstr "Wollen Sie den ausgewählten Schlüssel wirklich löschen?" + +#: ../lib/GUI.pm:2553 +msgid "Do you really want to delete the selected Certificate?" +msgstr "Wollen Sie das ausgewählte Zertifikat wirklich löschen?" + +#: ../lib/GUI.pm:2603 +msgid "Overwrite Request/Key" +msgstr "Lösche Anforderung/Schlüssel" + +#: ../lib/GUI.pm:2609 +msgid "The Key or the Request is already existing!" +msgstr "Es existiert bereits ein Schlüssel oder eine Anforderung!" + +#: ../lib/GUI.pm:2614 +msgid "You won't be able to sign this Request" +msgstr "Sie werden die Anforderung nicht signieren können" + +#: ../lib/GUI.pm:2619 +msgid "if the corresponding certificate is still valid" +msgstr "falls das Zertifikat noch gültig ist" + +#: ../lib/GUI.pm:2636 +msgid "The Certificate will be longer valid than your CA!" +msgstr "Das Zertifikat wird länger gültig sein als die CA!" + +#: ../lib/GUI.pm:2638 +msgid "This may cause problems with some software!!" +msgstr "Das kann mit einigen Programmen Probleme bereiten!" + +#: ../lib/GUI.pm:2653 +msgid "Expirationdate Warning" +msgstr "Warnung - Gültigkeit" + +#: ../lib/GUI.pm:2688 ../lib/GUI/WORDS.pm:69 +msgid "Serial" +msgstr "Seriennummer" + +#: ../lib/GUI.pm:2690 ../lib/GUI/WORDS.pm:70 ../lib/GUI/X509_browser.pm:175 +msgid "Status" +msgstr "Status" + +#: ../lib/GUI.pm:2691 ../lib/GUI/WORDS.pm:64 +msgid "Expiration Date" +msgstr "Gültig bis" + +#: ../lib/GUI.pm:2692 +msgid "Revocation Date" +msgstr "Widerrufen am" + +#: ../lib/GUI.pm:2693 +msgid "Revocation Reason" +msgstr "Grund des Widerrufs:" + +#: ../lib/GUI.pm:2719 ../lib/OpenSSL.pm:705 +msgid "EXPIRED" +msgstr "ABGELAUFEN" + +#: ../lib/GUI.pm:2721 ../lib/OpenSSL.pm:718 +msgid "REVOKED" +msgstr "WIDERRUFEN" + +#: ../lib/GUI.pm:2741 +msgid "CA History" +msgstr "CA Verlauf" + +#: ../lib/GUI.pm:2775 +msgid "Overwrite Certificate" +msgstr "Zertifikat überschreiben" + +#: ../lib/GUI.pm:2781 +msgid "There seems to be a certificate with the same Subject already." +msgstr "Es existiert bereits ein Zertifikat mit identischem Namen." + +#: ../lib/GUI.pm:2786 +msgid "" +"Creating a new one (overwrite) will fail if it's not revoked or expired!" +msgstr "" +"Das Erstellen (Überschreiben) eines neuen Zertifikats wird fehlschlagen, " +"falls das Alte nicht widerrufen oder abgelaufen ist!" + +#: ../lib/GUI.pm:2792 +msgid "Really try to overwrite the Certificate?" +msgstr "Wirklich versuchen das Zertifikat zu überschreiben?" + +#: ../lib/GUI.pm:2825 +msgid "Convert CA" +msgstr "Konvertiere CA" + +#: ../lib/GUI.pm:2833 +msgid "" +"This CA seems to be created with openssl 0.9.6x. And it seems like you have " +"switched to openssl 0.9.7x." +msgstr "" +"Diese CA wurde mit OpenSSL 0.9.6x erstellt. Es schaut so aus, als ob Sie " +"seither zu OpenSSL 0.9.7x gewechselt hätten." + +#: ../lib/GUI.pm:2841 +msgid "" +"You won't be able to revoke the existing certificates without converting the " +"index file of this CA to the new format." +msgstr "" +"Existierende Zertifikate können nicht mehr widerrufen werden wenn die Index " +"Datei nicht in das neue Format konvertiert wird." + +#: ../lib/GUI.pm:2849 +msgid "" +"Attention: it will not be easy to switch back, this has to be done manually" +msgstr "Achtung: Der Rückweg ist nur manuell möglich" + +#: ../lib/GUI.pm:2875 +msgid "Delete Key" +msgstr "Schlüssel Löschen" + +#: ../lib/GUI.pm:2904 +msgid "View Certificate" +msgstr "Zertifikat anzeigen" + +#: ../lib/GUI.pm:2925 +msgid "Renew Certificate" +msgstr "Zertifikat Erneuern" + +#: ../lib/GUI.pm:2933 +msgid "Delete Certificate" +msgstr "Zertifikat löschen" + +#: ../lib/GUI.pm:2956 +msgid "Create Key and Certificate (Server)" +msgstr "Einen neuen Schlüssel und ein Zertifikat (Server) erzeugen" + +#: ../lib/GUI.pm:2962 +msgid "Create Key and Certificate (Client)" +msgstr "Einen neuen Schlüssel und ein Zertifikat (Benutzer) erzeugen" + +#: ../lib/GUI.pm:2983 +msgid "Renew Certificate (Server)" +msgstr "Zertifikat Erneuern (Server)" + +#: ../lib/GUI.pm:2990 +msgid "Renew Certificate (Client)" +msgstr "Zertifikat Erneuern (Benutzer)" + +#: ../lib/GUI.pm:3012 +msgid "Sign Request (Server)" +msgstr "Signiere Anforderung (Server)" + +#: ../lib/GUI.pm:3019 +msgid "Sign Request (Client)" +msgstr "Signiere Anforderung (Benutzer)" + +#: ../lib/GUI.pm:3047 +msgid "View Request" +msgstr "Anforderung anzeigen" + +#: ../lib/GUI.pm:3054 +msgid "New Request" +msgstr "Neue Anforderung" + +#: ../lib/GUI.pm:3076 +msgid "Delete Request" +msgstr "Lösche Anforderung" + +#: ../lib/HELPERS.pm:207 +#, c-format +msgid "Can't write exportdir: %s, %s" +msgstr "Fehler beim Schreiben des Exportverzeichnisses: %s: %s" + +#: ../lib/KEY.pm:45 ../lib/KEY.pm:137 +msgid "Please select a Key first" +msgstr "Bitte erst einen Schlüssel auswählen" + +#: ../lib/KEY.pm:54 +msgid "Key file not found:" +msgstr "Schlüssel Datei nicht gefunden:" + +#: ../lib/KEY.pm:101 +msgid "Can't open key directory" +msgstr "Fehler beim Öffnen des Schlüssel Verzeichnisses" + +#: ../lib/KEY.pm:194 +msgid "" +"Wrong password given\n" +"Decrypting of the Key failed\n" +"Export is not possible" +msgstr "" +"Sie haben ein falsches Passwort angegeben\n" +"Die Entschlüsselung des Schlüssels ist fehlgeschlagen\n" +"Der Export ist nicht möglich" + +#: ../lib/KEY.pm:199 +msgid "Converting failed, Export not possible" +msgstr "Fehler bei der Konvertierung, Export ist nicht möglich" + +#: ../lib/KEY.pm:206 ../lib/KEY.pm:410 +#, c-format +msgid "Can't open Key file: %s: %s" +msgstr "Fehler beim Öffnen der Schlüssel-Datei %s: %s" + +#: ../lib/KEY.pm:239 +#, c-format +msgid "Key succesfully exported to %s" +msgstr "Der Schlüssel wurde erfolgreich exportiert: %s" + +#: ../lib/KEY.pm:255 +msgid "Certificate is necessary for export as PKCS#12" +msgstr "Für den Export als PKCS#12 wird das Zertifikat benötigt" + +#: ../lib/KEY.pm:305 +#, c-format +msgid "Certificate is necessary for export as %s file" +msgstr "Für den Export als %s wird das Zertifikat benötigt" + +#: ../lib/KEY.pm:330 +msgid "Can't read Key file" +msgstr "Fehler beim Lesen der Schlüssel-Datei" + +#: ../lib/KEY.pm:392 +#, c-format +msgid "Invalid format for export requested: %s" +msgstr "Ungültiges Format für den Export angefordert: %s" + +#: ../lib/KEY.pm:398 +msgid "Something Failed ??" +msgstr "Irgenwas ist wohl schiefgelaufen??" + +#: ../lib/KEY.pm:448 +#, c-format +msgid "" +"Can't open Key file:\n" +"%s" +msgstr "" +"Fehler beim Öffnen der Schlüssel-Datei\n" +"%s" + +#: ../lib/KEY.pm:485 +msgid "The password for your old CA Key is wrong" +msgstr "Das Passwort für den importierten CA Schlüssel ist falsch" + +#: ../lib/OpenSSL.pm:73 +msgid "Creating DSA key in progress..." +msgstr "Die Erstellung des DSA Schlüssels läuft..." + +#: ../lib/OpenSSL.pm:107 +msgid "Creating RSA key in progress..." +msgstr "Die Erstellung des RSA Schlüssels läuft..." + +#: ../lib/OpenSSL.pm:456 +#, c-format +msgid "Can't open CRL '%s': %s" +msgstr "Fehler beim Öffnen der Widerrufliste '%s': %s" + +#: ../lib/OpenSSL.pm:471 ../lib/OpenSSL.pm:484 +msgid "Error converting CRL" +msgstr "Fehler beim Konvertieren der Widerrufsliste" + +#: ../lib/OpenSSL.pm:582 ../lib/OpenSSL.pm:595 +msgid "Error converting Certificate" +msgstr "Fehler beim Konvertieren des Zertifikats" + +#: ../lib/OpenSSL.pm:655 ../lib/OpenSSL.pm:672 +msgid "Error reading fingerprint from Certificate" +msgstr "Fehler beim Lesen des Fingerbdrucks des Zertifikats" + +#: ../lib/OpenSSL.pm:690 +msgid "Error reading subject from Certificate" +msgstr "Fehler beim Lesen des Namens des Zertifikats" + +#: ../lib/OpenSSL.pm:700 +msgid "Can't read CRL" +msgstr "Fehler beim Einlesen der Widerrufsliste" + +#: ../lib/OpenSSL.pm:723 +msgid "UNDEFINED" +msgstr "UNDEFINIERT" + +#: ../lib/OpenSSL.pm:750 +#, c-format +msgid "Can't open Request file %s: %s" +msgstr "Fehler beim Einlesen der Anforderungs-Datei %s: %s" + +#: ../lib/OpenSSL.pm:767 ../lib/OpenSSL.pm:781 ../lib/REQ.pm:685 +msgid "Error converting Request" +msgstr "Fehler beim Konvertieren der Anforderung" + +#: ../lib/OpenSSL.pm:863 +#, c-format +msgid "Can't open file %s: %s" +msgstr "Fehler beim Einlesen der Datei %s: %s" + +#: ../lib/OpenSSL.pm:981 ../lib/OpenSSL.pm:1013 +#, c-format +msgid "Can't read index %s: %s" +msgstr "Fehler beim Einlesen der Index-Datei %s: %s" + +#: ../lib/OpenSSL.pm:1023 +#, c-format +msgid "Can't write index %s: %s" +msgstr "Fehler beim Schreiben der Index-Datei %s: %s" + +#: ../lib/REQ.pm:58 +#, c-format +msgid "Strange value for 'opts': %s" +msgstr "Ungültiger Wert für 'opts': %s" + +#: ../lib/REQ.pm:101 +msgid "Please specify at least Common Name " +msgstr "Bitte geben Sie mindestens einen allgemeinen Namen " + +#: ../lib/REQ.pm:102 +msgid "and Password" +msgstr "und ein Passwort" + +#: ../lib/REQ.pm:246 ../lib/REQ.pm:376 +msgid "Request file not found" +msgstr "Anforderungs-Datei nicht gefunden" + +#: ../lib/REQ.pm:299 +msgid "Can't open Request directory" +msgstr "Fehler beim Öffnen des Anforderungs-Verzeichnisses" + +#: ../lib/REQ.pm:320 +#, c-format +msgid " Read Request: %s" +msgstr "...Lese Anforderung: %s" + +#: ../lib/REQ.pm:414 +msgid "Can't read Request file" +msgstr "Fehler beim Lesen der Anforderungs-Datei" + +#: ../lib/REQ.pm:458 +msgid "Can't read serial" +msgstr "Fehler beim Einlesen der Seriennummer" + +#: ../lib/REQ.pm:531 +msgid "" +"Wrong CA password given\n" +"Signing of the Request failed" +msgstr "" +"Sie haben ein falsches CA Passwort angegeben\n" +"Fehler beim Signieren der Anforderung" + +#: ../lib/REQ.pm:537 +msgid "" +"CA Key not found\n" +"Signing of the Request failed" +msgstr "" +"Der CA Schlüssel wurde nicht gefunden\n" +"Fehler beim Signieren der Anforderung" + +#: ../lib/REQ.pm:543 +msgid "" +"Certificate already existing\n" +"Signing of the Request failed" +msgstr "" +"Ein gültiges Zertifikat existiert bereits\n" +"Fehler beim Signieren der Anforderung" + +#: ../lib/REQ.pm:549 +msgid "" +"Invalid IP Address given\n" +"Signing of the Request failed" +msgstr "" +"Ungültige IP Adresse angegeben\n" +"Fehler beim Signieren der Anforderung" + +#: ../lib/REQ.pm:556 ../lib/REQ.pm:574 +msgid "Signing of the Request failed" +msgstr "Fehler beim Signieren der Anforderung" + +#: ../lib/REQ.pm:581 +msgid "Can't read Certificate file" +msgstr "Fehler beim Einlesen der Zertifikats-Datei" + +#: ../lib/REQ.pm:587 ../lib/REQ.pm:597 +msgid "Can't write Certificate file" +msgstr "Fehler beim Schreiben der Zertifikats-Datei" + +#: ../lib/REQ.pm:609 +msgid "" +"Request signed succesfully.\n" +"Certificate created" +msgstr "" +"Die Anforderung wurde erfolgreich unterschrieben.\n" +"Das Zertifikat wurde erstellt." + +#: ../lib/REQ.pm:650 +msgid "Please select a Request file first" +msgstr "Bitte zuerst eine Anforderungs-Datei auswählen" + +#: ../lib/REQ.pm:656 +msgid "Can't find Request file: " +msgstr "Anforderungs-Datei wurde nicht gefunden: " + +#: ../lib/REQ.pm:662 +msgid "Can't read Request file:" +msgstr "Fehler beim Lesen der Anforderungs-Datei:" + +#: ../lib/REQ.pm:708 +msgid "Parsing Request failed" +msgstr "Fehler beim Analysieren der Anforderung" + +#: ../lib/TCONFIG.pm:42 +msgid "Please select a CA first" +msgstr "Bitte zuerst eine CA auswählen" + +#: ../lib/TCONFIG.pm:49 +msgid "Can't open configuration" +msgstr "Fehler beim Öffnen der Konfiguration" + +#: ../lib/TCONFIG.pm:284 ../lib/TCONFIG.pm:299 ../lib/GUI/TCONFIG.pm:47 +#: ../lib/GUI/TCONFIG.pm:1302 +msgid "Can't get CA name" +msgstr "Es wurde kein CA Name übergeben" + +#: ../lib/TCONFIG.pm:327 +msgid "Can't open configfile" +msgstr "Fehler beim Öffnen der Konfigurations-Datei" + +#: ../lib/GUI/HELPERS.pm:54 ../lib/GUI/HELPERS.pm:94 ../lib/GUI/HELPERS.pm:135 +msgid "Command Details" +msgstr "Kommando Details" + +#: ../lib/GUI/HELPERS.pm:305 +msgid "Request Files (*.pem, *.der, *.req)" +msgstr "Anforderungs Dateien (*.pem, *.der, *.req)" + +#: ../lib/GUI/HELPERS.pm:312 +msgid "All Files (*.*)" +msgstr "Alle Dateien (*.*)" + +#: ../lib/GUI/TCONFIG.pm:74 +msgid "" +"All Settings are written unchanged to openssl.conf.\n" +"So please study the documentation of OpenSSL if you don't know exactly what " +"to do.\n" +"If you are still unsure - keep the defaults and everything is expected to " +"work fine." +msgstr "" +"Alle Einstellungen werden ungeändert in openssl.conf übernommen.\n" +"Wenn Sie nicht genau wissen was das alles bedeutet, so nutzen Sie bitte die " +"Dokumentation von OpenSSL.\n" +"Falls Sie dann immer noch unsicher sind, lassen Sie einfach die " +"Standardeinstellungen." + +#: ../lib/GUI/TCONFIG.pm:108 ../lib/GUI/TCONFIG.pm:116 +msgid "OpenSSL Configuration" +msgstr "OpenSSL Konfiguration" + +#: ../lib/GUI/TCONFIG.pm:129 +msgid "Only change these options, if you really know, what you are doing!!" +msgstr "Ändern Sie diese Optionen nur, wenn Sie wirklich wissen was Sie tun!" + +#: ../lib/GUI/TCONFIG.pm:137 +msgid "You should be aware, that some options may break some crappy software!!" +msgstr "" +"Sie sollten sich bewusst sein, dass manche Software nicht mit allen " +"möglichen Optionen umgehen kann." + +#: ../lib/GUI/TCONFIG.pm:146 ../lib/GUI/TCONFIG.pm:1348 +msgid "If you are unsure: leave the defaults untouched" +msgstr "Lassen Sie die Standard Einstellungen wenn Sie sich nicht sicher sind" + +#: ../lib/GUI/TCONFIG.pm:182 +msgid "These Settings are passed to OpenSSL for creating Server Certificates" +msgstr "Diese Optionen werden zum Erstellen von Server Zertifikaten eingesetzt" + +#: ../lib/GUI/TCONFIG.pm:187 ../lib/GUI/TCONFIG.pm:612 +#: ../lib/GUI/TCONFIG.pm:1019 ../lib/GUI/TCONFIG.pm:1239 +#: ../lib/GUI/TCONFIG.pm:1340 +msgid "Multiple Values can be separated by \",\"" +msgstr "Mehrere Werte können durch \",\" getrennt werden" + +#: ../lib/GUI/TCONFIG.pm:207 ../lib/GUI/TCONFIG.pm:209 +msgid "Server Certificate Settings" +msgstr "Server Zertifikate" + +#: ../lib/GUI/TCONFIG.pm:215 ../lib/GUI/TCONFIG.pm:638 +#: ../lib/GUI/TCONFIG.pm:1047 ../lib/GUI/TCONFIG.pm:1462 +msgid "Subject alternative name (subjectAltName):" +msgstr "Subject Alternative Name (subjectAltName):" + +#: ../lib/GUI/TCONFIG.pm:312 ../lib/GUI/TCONFIG.pm:744 +#: ../lib/GUI/TCONFIG.pm:1107 ../lib/GUI/TCONFIG.pm:1358 +msgid "Key Usage (keyUsage):" +msgstr "Verwendung des Schlüssels (keyUsage):" + +#: ../lib/GUI/TCONFIG.pm:391 ../lib/GUI/TCONFIG.pm:819 +msgid "Extended Key Usage (extendedKeyUsage):" +msgstr "Verwendung des Schlüssels (erweitert/extendedKeyUsage):" + +#: ../lib/GUI/TCONFIG.pm:467 ../lib/GUI/TCONFIG.pm:894 +#: ../lib/GUI/TCONFIG.pm:1076 ../lib/GUI/TCONFIG.pm:1431 +msgid "Netscape Certificate Type (nsCertType):" +msgstr "Netscape Zertifikatstyp (nsCertType):" + +#: ../lib/GUI/TCONFIG.pm:496 +msgid "Netscape SSL Server Name (nsSslServerName):" +msgstr "Netscape SSL Server Name (nsSslServerName):" + +#: ../lib/GUI/TCONFIG.pm:521 ../lib/GUI/TCONFIG.pm:924 +#: ../lib/GUI/TCONFIG.pm:1182 +msgid "Netscape Revocation URL (nsRevocationUrl):" +msgstr "Netscape Widerrufs URL (nsRevocationUrl):" + +#: ../lib/GUI/TCONFIG.pm:546 ../lib/GUI/TCONFIG.pm:948 +msgid "Netscape Renewal URL (nsRenewalUrl):" +msgstr "Netscape Erneuerungs URL (nsRenewalUrl):" + +#: ../lib/GUI/TCONFIG.pm:607 +msgid "These Settings are passed to OpenSSL for creating Client Certificates" +msgstr "" +"Diese Optionen werden für die Erstellung von Benutzer Zertifikaten eingesetzt" + +#: ../lib/GUI/TCONFIG.pm:632 +msgid "Client Certificate Settings" +msgstr "Benutzer Zertifikate" + +#: ../lib/GUI/TCONFIG.pm:1014 +msgid "These Settings are passed to OpenSSL for creating CA Certificates" +msgstr "" +"Diese Optionen werden für die Erstellung von CA Zertifikaten an OpenSSL " +"weitergegeben" + +#: ../lib/GUI/TCONFIG.pm:1039 ../lib/GUI/TCONFIG.pm:1041 +msgid "CA Certificate Settings" +msgstr "CA Zertifikats Einstellungen" + +#: ../lib/GUI/TCONFIG.pm:1234 +msgid "" +"These Settings are passed to OpenSSL for creating Certificate Revocation " +"Lists" +msgstr "" +"Diese Optionen werden für die Erstellung von Widerrufslisten eingesetzt" + +#: ../lib/GUI/TCONFIG.pm:1260 +msgid "Revocation List Settings" +msgstr "Widerrufslisten" + +#: ../lib/GUI/TCONFIG.pm:1322 +msgid "CA Configuration" +msgstr "Konfiguration der CA" + +#: ../lib/GUI/TCONFIG.pm:1330 +msgid "These Settings are passed to OpenSSL for creating this CA Certificate" +msgstr "Diese Optionen werden für die Erstellung dieses CA Zertifikats" + +#: ../lib/GUI/TCONFIG.pm:1335 +msgid "and the CA Certificates of every SubCA, created with this CA." +msgstr "und für die Erstellung aller SubCAs an OpenSSL weitergegeben." + +#: ../lib/GUI/WORDS.pm:26 ../lib/GUI/WORDS.pm:73 +msgid "Not set" +msgstr "Nicht gesetzt" + +#: ../lib/GUI/WORDS.pm:27 ../lib/GUI/WORDS.pm:74 +msgid "Ask User" +msgstr "Frage Benutzer" + +#: ../lib/GUI/WORDS.pm:28 ../lib/GUI/WORDS.pm:75 +msgid "critical" +msgstr "kritisch" + +#: ../lib/GUI/WORDS.pm:29 ../lib/GUI/WORDS.pm:76 +msgid "not critical" +msgstr "nicht kritisch" + +#: ../lib/GUI/WORDS.pm:30 ../lib/GUI/WORDS.pm:77 +msgid "Copy Email" +msgstr "Kopiere Email" + +#: ../lib/GUI/WORDS.pm:31 ../lib/GUI/WORDS.pm:78 +msgid "raw" +msgstr "raw" + +#: ../lib/GUI/WORDS.pm:32 ../lib/GUI/WORDS.pm:79 +msgid "DNS Name" +msgstr "DNS Name" + +#: ../lib/GUI/WORDS.pm:33 ../lib/GUI/WORDS.pm:81 +msgid "IP Address" +msgstr "IP Adresse" + +#: ../lib/GUI/WORDS.pm:34 ../lib/GUI/WORDS.pm:80 +msgid "Email" +msgstr "Email" + +#: ../lib/GUI/WORDS.pm:35 ../lib/GUI/WORDS.pm:82 +msgid "SSL Server" +msgstr "SSL Server" + +#: ../lib/GUI/WORDS.pm:36 ../lib/GUI/WORDS.pm:83 +msgid "SSL Server, SSL Client" +msgstr "SSL Server, SSL CLient" + +#: ../lib/GUI/WORDS.pm:37 ../lib/GUI/WORDS.pm:84 +msgid "Key Encipherment" +msgstr "Verschlüsselung" + +#: ../lib/GUI/WORDS.pm:38 ../lib/GUI/WORDS.pm:85 +msgid "Digital Signature" +msgstr "Digitale Signatur" + +#: ../lib/GUI/WORDS.pm:39 ../lib/GUI/WORDS.pm:86 +msgid "Key Encipherment, Digital Signature" +msgstr "Verschlüsselung, Digitale Signatur" + +#: ../lib/GUI/WORDS.pm:40 ../lib/GUI/WORDS.pm:87 +msgid "Object Signing" +msgstr "Objekt Signieren" + +#: ../lib/GUI/WORDS.pm:41 ../lib/GUI/WORDS.pm:91 +msgid "SSL Client, Object Signing" +msgstr "SSL Benutzer, Objekte Signieren" + +#: ../lib/GUI/WORDS.pm:42 ../lib/GUI/WORDS.pm:89 +msgid "SSL Client, Email(S/MIME)" +msgstr "SSL Benutzer, Email(S/MIME)" + +#: ../lib/GUI/WORDS.pm:43 ../lib/GUI/WORDS.pm:90 +msgid "SSL Client" +msgstr "SSL Benutzer" + +#: ../lib/GUI/WORDS.pm:44 ../lib/GUI/WORDS.pm:88 +msgid "Email(S/MIME)" +msgstr "Email(S/MIME)" + +#: ../lib/GUI/WORDS.pm:45 ../lib/GUI/WORDS.pm:92 +msgid "SSL Client, Email, Object Signing" +msgstr "SSL Benutzer, Email, Objekte Signieren" + +#: ../lib/GUI/WORDS.pm:46 ../lib/GUI/WORDS.pm:93 +msgid "Object Signing CA" +msgstr "Objekt Signierende CA" + +#: ../lib/GUI/WORDS.pm:47 ../lib/GUI/WORDS.pm:94 +msgid "S/MIME CA" +msgstr "S/MIME CA" + +#: ../lib/GUI/WORDS.pm:48 ../lib/GUI/WORDS.pm:95 +msgid "SSL CA" +msgstr "SSL CA" + +#: ../lib/GUI/WORDS.pm:49 ../lib/GUI/WORDS.pm:96 +msgid "SSL CA, S/MIME CA" +msgstr "SSL CA, S/MIME CA" + +#: ../lib/GUI/WORDS.pm:50 ../lib/GUI/WORDS.pm:97 +msgid "SSL CA, Object Signing CA" +msgstr "SSL CA, Objekt Signierende CA" + +#: ../lib/GUI/WORDS.pm:51 ../lib/GUI/WORDS.pm:98 +msgid "S/MIME CA, Object Signing CA" +msgstr "S/MIME CA, Objekt Signierende CA" + +#: ../lib/GUI/WORDS.pm:52 ../lib/GUI/WORDS.pm:99 +msgid "SSL CA, S/MIME CA, Object Signing CA" +msgstr "SSL CA, S/MIME CA, Objekt Signierende CA" + +#: ../lib/GUI/WORDS.pm:53 ../lib/GUI/WORDS.pm:100 +msgid "Certificate Signing" +msgstr "Zertifikate Signieren" + +#: ../lib/GUI/WORDS.pm:54 ../lib/GUI/WORDS.pm:101 +msgid "CRL Signing" +msgstr "CRL Signieren" + +#: ../lib/GUI/WORDS.pm:55 ../lib/GUI/WORDS.pm:102 +msgid "Certificate Signing, CRL Signing" +msgstr "Zertifikate Signieren, CRL Signieren" + +#: ../lib/GUI/WORDS.pm:63 +msgid "Creation Date" +msgstr "Gültig ab" + +#: ../lib/GUI/WORDS.pm:66 +msgid "Public Key Algorithm" +msgstr "Algorithmus des öff. Schlüssels" + +#: ../lib/GUI/WORDS.pm:67 +msgid "Signature Algorithm" +msgstr "Algorithmus der Signatur" + +#: ../lib/GUI/WORDS.pm:71 ../lib/GUI/X509_infobox.pm:80 +msgid "Fingerprint (MD5)" +msgstr "Fingerabdruck (MD5)" + +#: ../lib/GUI/WORDS.pm:72 ../lib/GUI/X509_infobox.pm:89 +msgid "Fingerprint (SHA1)" +msgstr "Fingerabdruck (SHA1)" + +#: ../lib/GUI/X509_browser.pm:448 +msgid "Certificate Information" +msgstr "Daten des Zertifikates" + +#: ../lib/GUI/X509_browser.pm:452 +msgid "Request Information" +msgstr "Daten der Anforderung" + +#: ../lib/GUI/X509_browser.pm:571 +msgid "Invalid browser mode for selection_fname():" +msgstr "Ungültiger Browser Modus für selection_fname()" + +#: ../lib/GUI/X509_browser.pm:571 ../lib/GUI/X509_browser.pm:607 +#: ../lib/GUI/X509_browser.pm:656 ../lib/GUI/X509_browser.pm:677 +#: ../lib/GUI/X509_browser.pm:698 ../lib/GUI/X509_browser.pm:725 +msgid " " +msgstr " " + +#: ../lib/GUI/X509_browser.pm:607 +msgid "Invalid browser mode for selection_dn():" +msgstr "Ungültiger Browser Modus für selection_dn()" + +#: ../lib/GUI/X509_browser.pm:656 ../lib/GUI/X509_browser.pm:677 +msgid "Invalid browser mode for selection_cn():" +msgstr "Ungültiger Browser Modus für selection_cn()" + +#: ../lib/GUI/X509_browser.pm:698 +msgid "Invalid browser mode for selection_status():" +msgstr "Ungültiger Browser Modus für selection_status():" + +#: ../lib/GUI/X509_browser.pm:725 +msgid "Invalid browser mode for selection_type():" +msgstr "Ungültiger Browser Modus für selection_type()" + +#: ../tinyca2:63 +#, c-format +msgid "Can't execute %s.\n" +msgstr "Fehler beim Ausführen von %s\n" + +#: ../tinyca2:64 +msgid "Configure correct path to openssl in tinyca.\n" +msgstr "Bitte korrekten Pfad zu openssl in tinyca eintragen.\n" + +#: ../tinyca2:69 +msgid "zip command not found, support disabled.\n" +msgstr "Das zip Programm wurde nicht gefunden, Unterstützung deaktiviert.\n" + +#: ../tinyca2:70 +msgid "Configure correct path to zip in tinyca.\n" +msgstr "Bitte korrekten Pfad zu zip in tinyca eintragen.\n" + +#: ../tinyca2:74 +msgid "tar command not found, support disabled.\n" +msgstr "Das tar Programm wurde nicht gefunden, Unterstützung deaktiviert.\n" + +#: ../tinyca2:75 +msgid "Configure correct path to tar in tinyca.\n" +msgstr "Bitte korrekten Pfad zu tar in tinyca eintragen.\n" + +#: ../tinyca2:82 +msgid "Can't find templatedir.\n" +msgstr "Kann das Vorlagen-Verzeichnis nicht finden.\n" + +#: ../tinyca2:83 +msgid "Please configure correct path with templates in tinyca.\n" +msgstr "Bitte korrekten Pfad zu den Vorlagen in tinyca eintragen\n" diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..55f70c2 --- /dev/null +++ b/po/es.po @@ -0,0 +1,2010 @@ +# translation of es.po to spanish +# This file is distributed under the same license as the tinyca package. +# Copyright (C) 2004 Ramn Pons Vivanco +# +msgid "" +msgstr "" +"Project-Id-Version: es\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-07-13 23:47+0200\n" +"PO-Revision-Date: 2004-11-10 18:15+0100\n" +"Last-Translator: Ramn Pons Vivanco \n" +"Language-Team: spanish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: emacs21\n" + +#: ../lib/CA.pm:44 +msgid "error: can't open basedir: " +msgstr "error: no se puede abrir el directorio base: " + +#: ../lib/CA.pm:102 +msgid " Opening CA: " +msgstr " Abriendo CA: " + +#: ../lib/CA.pm:109 ../lib/CA.pm:270 +msgid "Invalid CA selected" +msgstr "CA seleccionada no vlida" + +#: ../lib/CA.pm:154 +msgid " Initializing OpenSSL" +msgstr " Inicializando OpenSSL" + +#: ../lib/CA.pm:160 +msgid " Check for CA Version" +msgstr " Comprobar versin de la CA" + +#: ../lib/CA.pm:167 ../lib/CA.pm:195 +msgid "Can't open index file: " +msgstr "No se puede abir el ndice: " + +#: ../lib/CA.pm:182 +msgid " Convert CA" +msgstr " Convertir CA" + +#: ../lib/CA.pm:201 +msgid "Can't open index backup: " +msgstr "No se puede abir la copia de seguridad del ndice: " + +#: ../lib/CA.pm:218 +msgid "This CA is converted for openssl 0.9.7x now." +msgstr "Esta CA se convertir a openssl 0.9.7x ahora." + +#: ../lib/CA.pm:220 +msgid "You will find a backup copy of the index file at: " +msgstr "Encontrar una copia de seguridad del ndice en: " + +#: ../lib/CA.pm:229 +msgid " Read Configuration" +msgstr " Leer Configuracin" + +#: ../lib/CA.pm:235 +msgid " Create GUI" +msgstr " Crear GUI" + +#: ../lib/CA.pm:241 +msgid " Create Toolbar" +msgstr " Crear barra de herramientas" + +#: ../lib/CA.pm:247 +msgid " Actual CA: " +msgstr " CA actual: " + +#: ../lib/CA.pm:332 +#, c-format +msgid "CA: %s deleted" +msgstr "CA: %s eliminada" + +#: ../lib/CA.pm:386 +msgid "Password of parent CA is needed for creating a Sub CA" +msgstr "Se necesita el password de la CA padre para crear una Sub CA" + +#: ../lib/CA.pm:395 +msgid "Name must be filled in and must" +msgstr "El nombre debe ser rellenado obligatoriamente" + +#: ../lib/CA.pm:396 +msgid " not contain Spaces" +msgstr " no debe contener Espacios" + +#: ../lib/CA.pm:408 +msgid "Please specify at least Common Name, " +msgstr "Por favor introduzca por lo menos el Nombre Comn, " + +#: ../lib/CA.pm:409 +msgid "Country and Password" +msgstr "Pas y Password" + +#: ../lib/CA.pm:416 ../lib/REQ.pm:109 +msgid "Passwords don't match" +msgstr "Los Passwords no coinciden" + +#: ../lib/CA.pm:424 ../lib/REQ.pm:120 +msgid "Country must be exact 2 letter code" +msgstr "El Pas debe tener un cdigo exactamente de 2 letras" + +#: ../lib/CA.pm:428 +#, c-format +msgid "CA: %s already exists" +msgstr "Ya existe la CA: %s" + +#: ../lib/CA.pm:468 +msgid "Name for storage must be filled in and must not contain spaces" +msgstr "" +"El nombre debe ser rellenado obligatoriamente y no debe contener espacios" + +#: ../lib/CA.pm:477 +msgid "You didn't give a password for the private CA key." +msgstr "No ha introducido password para la Clave privada." + +#: ../lib/CA.pm:479 +msgid "The import will fail, if the key is encrypted." +msgstr "La importacin fallar si la clave est cifrada." + +#: ../lib/CA.pm:488 +msgid "Please give a new password for the CA" +msgstr "Por favor introduzca el password de la CA" + +#: ../lib/CA.pm:495 +msgid "New passwords don't match" +msgstr "Los passwords nuevos no coinciden" + +#: ../lib/CA.pm:503 +msgid "Please give a CA certificate to import" +msgstr "Por favor seleccione un Certificado para importar" + +#: ../lib/CA.pm:508 +#, c-format +msgid "" +"Can't read CA certificate file:\n" +"%s" +msgstr "" +"No se puede leer el fichero del Certificado de la CA:\n" +"%s" + +#: ../lib/CA.pm:518 +msgid "Please give a CA keyfile to import" +msgstr "Por favor seleccione un fichero con la Clave de la CA para importar" + +#: ../lib/CA.pm:523 +#, c-format +msgid "" +"Can't read CA key file:\n" +"%s" +msgstr "" +"No se puede leer el fichero con la Clave de la CA:\n" +"%s" + +#: ../lib/CA.pm:535 +msgid "Please give an Index file to import.\n" +msgstr "Por favor introduzca el fichero ndice a importar.\n" + +#: ../lib/CA.pm:536 +msgid "If you don't have an Index file, i'll try to generate one.\n" +msgstr "Si no existe un fichero ndice se generar uno.\n" + +#: ../lib/CA.pm:537 +msgid "Attention: This will cause all Certificates to show up as valid.\n" +msgstr "" +"Atencin: esto causar que todos los Certificados se muestren como vlidos.\n" + +#: ../lib/CA.pm:538 +msgid "Attention: Revoked Certificates will not be determined." +msgstr "Atencin: los Certificados revocados no se determinaran." + +#: ../lib/CA.pm:549 +#, c-format +msgid "" +"Can't read Index file:\n" +"%s" +msgstr "" +"No se puede leer el ndice:\n" +"%s" + +#: ../lib/CA.pm:562 +msgid "Please give a directory containing the certificates to import" +msgstr "" +"Por favor, seleccione un directorio que contenga los Certificados a importar" + +#: ../lib/CA.pm:567 +#, c-format +msgid "" +"Can't find certificate directory:\n" +"%s" +msgstr "" +"No se puede encontrar el directorio del Certificado:\n" +"%s" + +#: ../lib/CA.pm:578 +#, c-format +msgid "CA: %s already exists. Please choose another name" +msgstr "Ya existe la CA: %s. Por favor elija otro nombre" + +#: ../lib/CA.pm:594 +msgid "Can't find X509v3 Basic Constraints in CA Certificate\n" +msgstr "" +"No se pueden encontrar las restricciones bsicas X509v3 en el Certificado de " +"la CA\n" + +#: ../lib/CA.pm:595 +msgid "Import canceled" +msgstr "Importacin abortada" + +#: ../lib/CA.pm:601 +msgid "The selected CA Certificate is no valid CA certificate\n" +msgstr "" +"Los Certificados de la CA seleccionados no son Certificados de CA vlidos\n" + +#: ../lib/CA.pm:602 +#, c-format +msgid "X509v3 Basic Constraint is set to: %s" +msgstr "La restriccin bsica X509v3 vale: %s" + +#: ../lib/CA.pm:612 +#, c-format +msgid "" +"Can't open Index file:\n" +"%s" +msgstr "" +"No se puede abir el fichero ndice:\n" +"%s" + +#: ../lib/CA.pm:665 ../lib/CERT.pm:61 +#, c-format +msgid "Can't open Certificate directory: %s" +msgstr "No se puede abrir el directorio con los Certificados: %s" + +#: ../lib/CA.pm:684 ../lib/CERT.pm:84 +#, c-format +msgid " Read Certificate: %s" +msgstr " Leer Certificado: %s" + +#: ../lib/CA.pm:694 +#, c-format +msgid "Can't read Certificate file: %s" +msgstr "No se puede leer el fichero del Certificado: %s" + +#: ../lib/CA.pm:718 +#, c-format +msgid "Can't write Certificate file: %s" +msgstr "No se puede escribir el fichero del Certificado: %s" + +#: ../lib/CA.pm:768 ../lib/CA.pm:927 +msgid "Can't open Index file: " +msgstr "No se puede abrir el fichero ndice: " + +#: ../lib/CA.pm:780 +#, c-format +msgid "Can't write CA Certificate file: %s" +msgstr "No se puede escribir el fichero del Certificado: %s" + +#: ../lib/CA.pm:800 ../lib/CA.pm:934 +msgid "Can't write Serial file: " +msgstr "No se puede escribir el nmero de serie: " + +#: ../lib/CA.pm:814 +#, c-format +msgid "Can't write CA Key file: %s" +msgstr "No se puede escribir la Clave de la CA: %s" + +#: ../lib/CA.pm:831 ../lib/CA.pm:1155 +msgid "Generating CRL failed" +msgstr "Fall la generacin de CRL" + +#: ../lib/CA.pm:844 +#, c-format +msgid "Succesfully imported %d certificates\n" +msgstr "Certificados %d importados correctamente\n" + +#: ../lib/CA.pm:845 +msgid "Check the configuration of your imported CA." +msgstr "Compruebe la configuracin de la CA importada." + +#: ../lib/CA.pm:862 ../lib/CA.pm:971 +msgid "No CA name given" +msgstr "Nombre de la CA no introducido" + +#: ../lib/CA.pm:871 ../lib/CA.pm:876 ../lib/CA.pm:881 ../lib/CA.pm:886 +#: ../lib/CA.pm:891 ../lib/CA.pm:896 +msgid "Can't create directory: " +msgstr "No se puede crear el directorio: " + +#: ../lib/CA.pm:905 +#, c-format +msgid "Can't open template file %s %s" +msgstr "No se puede abrir la plantilla %s: %s" + +#: ../lib/CA.pm:910 ../lib/CA.pm:1207 ../lib/CA.pm:1274 ../lib/CERT.pm:637 +#: ../lib/KEY.pm:227 ../lib/REQ.pm:740 +#, c-format +msgid "Can't open output file: %s: %s" +msgstr "No se puede abrir el fichero de salida %s: %s" + +#: ../lib/CA.pm:984 ../lib/KEY.pm:482 ../lib/REQ.pm:167 +msgid "Generating key failed" +msgstr "Fall la generacin de clave" + +#: ../lib/CA.pm:1018 ../lib/REQ.pm:193 +msgid "Generating Request failed" +msgstr "Fall la generacin de Peticin" + +#: ../lib/CA.pm:1027 ../lib/CA.pm:1041 ../lib/CERT.pm:102 +msgid "Can't read Certificate" +msgstr "No se puede leer el Certificado" + +#: ../lib/CA.pm:1032 ../lib/CA.pm:1046 +msgid "Can't write Certificate" +msgstr "No se puede escribir el Certificado" + +#: ../lib/CA.pm:1086 +msgid "Generating certificate failed" +msgstr "Fall la generacin del Certificado" + +#: ../lib/CA.pm:1106 ../lib/CA.pm:1131 +#, c-format +msgid "Can't open ca certificate file %s %s" +msgstr "No se puede abrir el fichero del Certificado de la CA %s %s" + +#: ../lib/CA.pm:1115 +#, c-format +msgid "Can't create certificate chain file: %s: %s" +msgstr "No se puede crear el fichero con la Cadena de Certificados: %s: %s" + +#: ../lib/CA.pm:1164 +#, c-format +msgid "CA: %s created" +msgstr "CA: %s creada" + +#: ../lib/CA.pm:1199 +#, c-format +msgid "Can't open certificate chain file: %s: %s" +msgstr "No se puede abrir el fichero con la cadena de Certificados: %s: %s" + +#: ../lib/CA.pm:1220 +#, c-format +msgid "Certificate Chain succesfully exported to: %s" +msgstr "Cadena de Certificados exportada correctamente a: %s " + +#: ../lib/CA.pm:1255 ../lib/CERT.pm:580 ../lib/GUI.pm:166 ../lib/KEY.pm:348 +#: ../lib/REQ.pm:71 ../lib/REQ.pm:389 +msgid "Can't read CA certificate" +msgstr "No se puede leer el Certificado de la CA" + +#: ../lib/CA.pm:1265 +#, c-format +msgid "Invalid Format for export_ca_cert(): %s" +msgstr "Formato erroneo para export_ca_cert(): %s" + +#: ../lib/CA.pm:1287 +#, c-format +msgid "Certificate succesfully exported to: %s" +msgstr "Certificado exportado correctamente a: %s" + +#: ../lib/CA.pm:1320 +msgid "Please give the output file" +msgstr "Por favor introduzca fichero de salida" + +#: ../lib/CA.pm:1328 +msgid "Please give the CA password to create the Revocation List" +msgstr "" +"Por favor introduzca el password de la CA para crear la Lista de Revocacin" + +#: ../lib/CA.pm:1349 +msgid "" +"Wrong CA password given\n" +"Generating Revocation List failed" +msgstr "" +"Password de la CA introducido incorrecto\n" +"Fall la generacin de la Lista de Revocacin" + +#: ../lib/CA.pm:1353 +msgid "" +"CA Key not found\n" +"Generating Revocation List failed" +msgstr "" +"Clave de la CA no encontrada\n" +"Fall la generacin de la Lista de Revocacin" + +#: ../lib/CA.pm:1357 ../lib/CA.pm:1363 +msgid "Generating Revocation List failed" +msgstr "Fall la generacin de la Lista de Revocacin" + +#: ../lib/CA.pm:1371 +#, c-format +msgid "CRL successfully exported to: %s" +msgstr "CRL exportada correctamente a: %s" + +#: ../lib/CERT.pm:143 ../lib/CERT.pm:199 ../lib/CERT.pm:322 ../lib/CERT.pm:381 +#: ../lib/GUI.pm:851 +msgid "Please select a Certificate first" +msgstr "Por favor seleccione un Certificado antes" + +#: ../lib/CERT.pm:151 ../lib/CERT.pm:209 ../lib/CERT.pm:333 ../lib/CERT.pm:400 +#: ../lib/GUI.pm:2706 ../lib/GUI.pm:2717 ../lib/OpenSSL.pm:702 +#: ../lib/GUI/X509_browser.pm:276 +msgid "VALID" +msgstr "VLIDO" + +#: ../lib/CERT.pm:153 +#, c-format +msgid "" +"Can't renew Certifikate with Status: %s\n" +"Please revoke the Certificate first" +msgstr "" +"No se puede renovar el Certificado con Estado: %s\n" +"Por favor revoque el Certificado antes" + +#: ../lib/CERT.pm:168 +msgid "" +"Key and Request are necessary for renewal of a Certificate\n" +"Renewal is not possible!" +msgstr "" +"Se necesitan Clave y Peticin para renovar un Certificado\n" +"No se puede renovar!" + +#: ../lib/CERT.pm:210 +#, c-format +msgid "Can't revoke Certifikate with Status: %s" +msgstr "No se puede revocar un Certificado con Estado: %s" + +#: ../lib/CERT.pm:256 +msgid "" +"Wrong CA password given\n" +"Revoking the Certificate failed" +msgstr "" +"El password de la CA introducido no es correcto\n" +"Fall la revocacin del Certificado" + +#: ../lib/CERT.pm:263 +msgid "" +"CA Key not found\n" +"Revoking the Certificate failed" +msgstr "" +"Clave de la CA no encontrada\n" +"Fall la revocacin del Certificado" + +#: ../lib/CERT.pm:270 +msgid "Revoking the Certificate failed" +msgstr "Fall la revocacin del Certificado" + +#: ../lib/CERT.pm:290 +msgid "Generating a new Revocation List failed" +msgstr "Fall la generacin de la Lista de Revocacin" + +#: ../lib/CERT.pm:335 +msgid "" +"Can't delete VALID certificate!\n" +"Please revoke the Certificate first." +msgstr "" +"No se puede eliminar un Certificado VLIDO!\n" +"Por favor revoque el Certificado antes." + +#: ../lib/CERT.pm:401 +msgid "Certificate seems not to be VALID" +msgstr "El Certificado parece no ser VLIDO" + +#: ../lib/CERT.pm:403 +msgid "Export is not possible" +msgstr "No se puede exportar" + +#: ../lib/CERT.pm:430 ../lib/KEY.pm:172 +msgid "Please give at least the output file" +msgstr "Por favor al menos introduzca el fichero de salida" + +#: ../lib/CERT.pm:436 +msgid "Key is necessary for export as PKCS#12" +msgstr "Se necesita la Clave para exportar como PKCS#12" + +#: ../lib/CERT.pm:438 ../lib/CERT.pm:454 ../lib/KEY.pm:257 ../lib/KEY.pm:308 +msgid "Export is not possible!" +msgstr "No se puede exportar!" + +#: ../lib/CERT.pm:452 +#, fuzzy, c-format +msgid "Key is necessary for export as %s" +msgstr "Se necesita la Clave para exportar como Zip" + +#: ../lib/CERT.pm:492 ../lib/KEY.pm:216 +#, fuzzy, c-format +msgid "Can't open Certificate file: %s: %s" +msgstr "No se puede abrir el fichero del Certificado de la CA %s %s" + +#: ../lib/CERT.pm:525 ../lib/KEY.pm:288 +msgid "Generating PKCS#12 failed" +msgstr "Fall la generacin de PKCS#12" + +#: ../lib/CERT.pm:533 ../lib/CERT.pm:616 ../lib/KEY.pm:295 ../lib/KEY.pm:381 +#, c-format +msgid "Certificate and Key successfully exported to %s" +msgstr "El Certificado y la Clave han sido correctamente exportados a %s" + +#: ../lib/CERT.pm:546 ../lib/CERT.pm:567 ../lib/REQ.pm:693 +#, c-format +msgid "Can't create temporary file: %s: %s" +msgstr "No se puede crear el fichero temporal: %s: %s" + +#: ../lib/CERT.pm:558 +#, fuzzy, c-format +msgid "Can't read Key file: %s: %s" +msgstr "No se puede abrir el fichero de Claves: %s: %s" + +#: ../lib/CERT.pm:588 ../lib/KEY.pm:321 ../lib/KEY.pm:337 ../lib/KEY.pm:355 +msgid "Can't create temporary file" +msgstr "No se puede crear un fichero temporal" + +#: ../lib/CERT.pm:609 ../lib/KEY.pm:375 +#, fuzzy, c-format +msgid "Generating %s file failed" +msgstr "Fall la generacin del fichero Zip" + +#: ../lib/CERT.pm:628 +#, c-format +msgid "Invalid Format for export_cert(): %s" +msgstr "Formato erroneo para export_cert(): %s" + +#: ../lib/CERT.pm:648 +#, c-format +msgid "Certificate successfully exported to: %s" +msgstr "Certificado correctamente exportado a: %s" + +#: ../lib/GUI.pm:171 ../lib/GUI.pm:178 +msgid "CA" +msgstr "CA" + +#: ../lib/GUI.pm:185 +msgid "CA Information" +msgstr "Informacin CA" + +#: ../lib/GUI.pm:204 +msgid "Certificates" +msgstr "Certificados" + +#: ../lib/GUI.pm:244 ../lib/GUI.pm:2689 ../lib/GUI/WORDS.pm:56 +#: ../lib/GUI/X509_browser.pm:160 ../lib/GUI/X509_browser.pm:168 +#: ../lib/GUI/X509_browser.pm:177 +msgid "Common Name" +msgstr "Nombre Comn" + +#: ../lib/GUI.pm:245 ../lib/GUI.pm:1273 ../lib/GUI.pm:2314 +#: ../lib/GUI/WORDS.pm:57 ../lib/GUI/X509_browser.pm:161 +#: ../lib/GUI/X509_browser.pm:169 ../lib/GUI/X509_browser.pm:178 +msgid "eMail Address" +msgstr "Direccin eMail" + +#: ../lib/GUI.pm:246 ../lib/GUI/WORDS.pm:59 ../lib/GUI/X509_browser.pm:162 +#: ../lib/GUI/X509_browser.pm:170 ../lib/GUI/X509_browser.pm:179 +msgid "Organizational Unit" +msgstr "Unidad Organizativa" + +#: ../lib/GUI.pm:247 ../lib/GUI/WORDS.pm:58 ../lib/GUI/X509_browser.pm:163 +#: ../lib/GUI/X509_browser.pm:171 ../lib/GUI/X509_browser.pm:180 +msgid "Organization" +msgstr "Organizacin" + +#: ../lib/GUI.pm:248 ../lib/GUI/WORDS.pm:60 ../lib/GUI/X509_browser.pm:164 +#: ../lib/GUI/X509_browser.pm:172 ../lib/GUI/X509_browser.pm:181 +msgid "Location" +msgstr "Ubicacin" + +#: ../lib/GUI.pm:249 ../lib/GUI/WORDS.pm:61 ../lib/GUI/X509_browser.pm:165 +#: ../lib/GUI/X509_browser.pm:173 ../lib/GUI/X509_browser.pm:182 +msgid "State" +msgstr "Provincia" + +#: ../lib/GUI.pm:250 ../lib/GUI/WORDS.pm:62 ../lib/GUI/X509_browser.pm:166 +#: ../lib/GUI/X509_browser.pm:174 ../lib/GUI/X509_browser.pm:183 +msgid "Country" +msgstr "Pas" + +#: ../lib/GUI.pm:251 ../lib/GUI/WORDS.pm:68 ../lib/GUI/X509_browser.pm:184 +msgid "Type" +msgstr "Tipo" + +#: ../lib/GUI.pm:265 +msgid "Keys" +msgstr "Claves" + +#: ../lib/GUI.pm:308 +msgid "Requests" +msgstr "Peticiones" + +#: ../lib/GUI.pm:399 +#, c-format +msgid " Actual CA: %s" +msgstr " CA actual: %s" + +#: ../lib/GUI.pm:402 +#, c-format +msgid " Actual CA: %s - Certificates" +msgstr " CA actual: %s - Certificados" + +#: ../lib/GUI.pm:405 +#, c-format +msgid " Actual CA: %s - Keys" +msgstr " CA actual : %s - Claves" + +#: ../lib/GUI.pm:408 +#, c-format +msgid " Actual CA: %s - Requests" +msgstr " CA actual: %s - Peticiones" + +#: ../lib/GUI.pm:457 ../lib/GUI.pm:1141 +msgid "Open CA" +msgstr "Abrir CA" + +#: ../lib/GUI.pm:463 +msgid "New CA" +msgstr "Nueva CA" + +#: ../lib/GUI.pm:469 ../lib/GUI.pm:2382 +msgid "Import CA" +msgstr "Importar CA" + +#: ../lib/GUI.pm:475 ../lib/GUI.pm:1143 +msgid "Delete CA" +msgstr "Eliminar CA" + +#: ../lib/GUI.pm:485 ../lib/GUI.pm:524 ../lib/GUI.pm:592 +msgid "Details" +msgstr "Detalles" + +#: ../lib/GUI.pm:491 +msgid "History" +msgstr "" + +#: ../lib/GUI.pm:497 +msgid "Sub CA" +msgstr "Sub CA" + +#: ../lib/GUI.pm:503 +msgid "Export CA" +msgstr "Exportar CA" + +#: ../lib/GUI.pm:509 ../lib/GUI.pm:1419 +msgid "Export CRL" +msgstr "Exportar CRL" + +#: ../lib/GUI.pm:516 +msgid "Export Chain" +msgstr "Exportar Cadena" + +#: ../lib/GUI.pm:530 ../lib/GUI.pm:598 +msgid "View" +msgstr "Ver" + +#: ../lib/GUI.pm:540 ../lib/GUI.pm:604 +msgid "New" +msgstr "Nuevo" + +#: ../lib/GUI.pm:547 ../lib/GUI.pm:578 +msgid "Export" +msgstr "Exportar" + +#: ../lib/GUI.pm:553 +msgid "Revoke" +msgstr "Revocar" + +#: ../lib/GUI.pm:563 +msgid "Renew" +msgstr "Renovar" + +#: ../lib/GUI.pm:570 ../lib/GUI.pm:584 ../lib/GUI.pm:627 +msgid "Delete" +msgstr "Eliminar" + +#: ../lib/GUI.pm:610 +msgid "Import" +msgstr "Importar" + +#: ../lib/GUI.pm:620 +msgid "Sign" +msgstr "Firmar" + +#: ../lib/GUI.pm:646 +msgid "_CA" +msgstr "_CA" + +#: ../lib/GUI.pm:649 +msgid "_Open CA" +msgstr "_Abrir CA" + +#: ../lib/GUI.pm:654 +msgid "_New CA" +msgstr "_Nueva CA" + +#: ../lib/GUI.pm:659 +msgid "_Delete CA" +msgstr "_Eliminar CA" + +#: ../lib/GUI.pm:667 +msgid "_Exit" +msgstr "_Salir" + +#: ../lib/GUI.pm:674 +msgid "_Preferences" +msgstr "_Preferencias" + +#: ../lib/GUI.pm:677 +#, fuzzy +msgid "Experts Only!!" +msgstr "Solo expertos!!" + +#: ../lib/GUI.pm:682 +msgid "OpenSSL _Configuration" +msgstr "_Configuracin OpenSSL" + +#: ../lib/GUI.pm:689 ../lib/GUI.pm:692 +msgid "_Help" +msgstr "_Ayuda" + +#: ../lib/GUI.pm:697 +msgid "_About TinyCA" +msgstr "_Sobre TinyCA" + +#: ../lib/GUI.pm:728 +msgid "Invalid mode for show_text():" +msgstr "Modo errneo para show_text():" + +#: ../lib/GUI.pm:733 ../lib/GUI.pm:848 ../lib/REQ.pm:236 ../lib/REQ.pm:367 +msgid "Please select a Request first" +msgstr "Por favor seleccione antes una Peticin" + +#: ../lib/GUI.pm:736 +msgid "Please select a certificate first" +msgstr "Por favor seleccione antes un Certificado" + +#: ../lib/GUI.pm:752 ../lib/GUI.pm:867 ../lib/GUI/X509_browser.pm:456 +#: ../lib/GUI/X509_browser.pm:515 +msgid "Can't read file" +msgstr "No se puede leer fichero" + +#: ../lib/GUI.pm:754 +msgid "Request" +msgstr "Peticin" + +#: ../lib/GUI.pm:754 +msgid "Certificate" +msgstr "Certificado" + +#: ../lib/GUI.pm:815 +#, fuzzy, c-format +msgid "Invalid mode for _show_popup_menu(): %s" +msgstr "Modo errneo para show_text():" + +#: ../lib/GUI.pm:843 +msgid "Invalid mode for show_details():" +msgstr "Modo erroneo para show_details()" + +#: ../lib/GUI.pm:869 ../lib/GUI.pm:969 ../lib/GUI.pm:3040 +msgid "Request Details" +msgstr "Detalles de la Peticin" + +#: ../lib/GUI.pm:869 ../lib/GUI.pm:969 ../lib/GUI.pm:2897 +msgid "Certificate Details" +msgstr "Detalles del Certificado" + +#: ../lib/GUI.pm:911 ../lib/GUI.pm:1679 ../lib/GUI.pm:3061 +msgid "Import Request" +msgstr "Importar Peticin" + +#: ../lib/GUI.pm:913 ../lib/GUI.pm:2438 +msgid "Import CA Certificate" +msgstr "Importar Certificado de la CA" + +#: ../lib/GUI.pm:921 +msgid "Do you want to import the following Certificate Request?" +msgstr "Quiere importar la siguiente Peticin de Certificado?" + +#: ../lib/GUI.pm:923 +msgid "Do you want to import the following CA Certificate?" +msgstr "Quiere importar la siguiente Peticin de Certificado?" + +#: ../lib/GUI.pm:977 +msgid "Subject DN" +msgstr "Asunto DN" + +#: ../lib/GUI.pm:1001 +msgid "Issuer" +msgstr "Firmante" + +#: ../lib/GUI.pm:1027 +msgid "Validity" +msgstr "Validez" + +#: ../lib/GUI.pm:1043 +msgid "Key/Request Details:" +msgstr "Detalles de Clave/Peticin:" + +#: ../lib/GUI.pm:1043 +msgid "Key/Certificate Details:" +msgstr "Detalles de Clave/Certificado:" + +#: ../lib/GUI.pm:1059 +msgid "Fingerprints" +msgstr "Huella digital" + +#: ../lib/GUI.pm:1075 +msgid "Requested X.509 Extensions" +msgstr "Extensiones X.509 pedidas" + +#: ../lib/GUI.pm:1075 +msgid "X.509v3 Extensions" +msgstr "Extensiones X.509v3" + +#: ../lib/GUI.pm:1100 +msgid "Requested Netscape Extensions" +msgstr "Extensiones Netscape pedidas" + +#: ../lib/GUI.pm:1100 +msgid "Netscape Extensions" +msgstr "Extensiones Netscape" + +#: ../lib/GUI.pm:1145 +msgid "Invalid action given: " +msgstr "Accin introducida erronea: " + +#: ../lib/GUI.pm:1167 ../lib/GUI.pm:1213 +msgid "Invalid action for show_select_ca_dialog(): " +msgstr "Accin erronea para show_select_ca_dialog(): " + +#: ../lib/GUI.pm:1189 +msgid "Available CAs" +msgstr "" + +#: ../lib/GUI.pm:1245 +msgid "Create Request" +msgstr "Crear Peticin" + +#: ../lib/GUI.pm:1246 +msgid "Create a new Certificate Request" +msgstr "Crear una nueva Peticin de Certificado" + +#: ../lib/GUI.pm:1260 +msgid "Common Name (eg, your Name," +msgstr "Nombre Comn (ej. su Nombre," + +#: ../lib/GUI.pm:1265 +msgid "your eMail Address" +msgstr "su Direccin eMail" + +#: ../lib/GUI.pm:1269 +msgid "or the Servers Name)" +msgstr "or el Nombre del Servidor)" + +#: ../lib/GUI.pm:1277 +msgid "Password (protect your private Key):" +msgstr "Password (protege su Clave privada):" + +#: ../lib/GUI.pm:1281 ../lib/GUI.pm:2294 +msgid "Password (confirmation):" +msgstr "Password (confirmacin):" + +#: ../lib/GUI.pm:1285 ../lib/GUI.pm:2286 +msgid "Country Name (2 letter code):" +msgstr "Nombre Pas (cdigo de 2 letras):" + +#: ../lib/GUI.pm:1289 ../lib/GUI.pm:2298 +msgid "State or Province Name:" +msgstr "Estado o Nombre de Provincia:" + +#: ../lib/GUI.pm:1293 ../lib/GUI.pm:2302 +msgid "Locality Name (eg. city):" +msgstr "Nombre Ubicacin (ej. ciudad):" + +#: ../lib/GUI.pm:1297 ../lib/GUI.pm:2306 +msgid "Organization Name (eg. company):" +msgstr "Nombre Organizacin (ej. compaa):" + +#: ../lib/GUI.pm:1303 ../lib/GUI.pm:1308 ../lib/GUI.pm:2310 +msgid "Organizational Unit Name (eg. section):" +msgstr "Unidad Organizativa (ej. seccin):" + +#: ../lib/GUI.pm:1313 ../lib/GUI.pm:2322 ../lib/GUI/WORDS.pm:65 +msgid "Keylength" +msgstr "Longitud Clave" + +#: ../lib/GUI.pm:1321 ../lib/GUI.pm:2352 +msgid "Digest" +msgstr "Resumen" + +#: ../lib/GUI.pm:1328 +msgid "Algorithm" +msgstr "Algoritmo" + +#: ../lib/GUI.pm:1359 ../lib/GUI.pm:2918 +msgid "Revoke Certificate" +msgstr "Revocar Certificado" + +#: ../lib/GUI.pm:1368 ../lib/GUI.pm:1444 ../lib/GUI.pm:2093 +msgid "CA Password:" +msgstr "Password CA:" + +#: ../lib/GUI.pm:1374 +msgid "Revocation Reason:" +msgstr "Razn Revocacin:" + +#: ../lib/GUI.pm:1419 +msgid "Export Revocation List to File" +msgstr "Exportar Lista de Revocacin a fichero" + +#: ../lib/GUI.pm:1427 ../lib/GUI.pm:1515 ../lib/GUI.pm:1563 ../lib/GUI.pm:1687 +#: ../lib/GUI.pm:1755 +msgid "File:" +msgstr "Fichero:" + +#: ../lib/GUI.pm:1438 ../lib/GUI.pm:1526 ../lib/GUI.pm:1574 ../lib/GUI.pm:1697 +#: ../lib/GUI.pm:1772 ../lib/GUI.pm:2435 ../lib/GUI.pm:2454 ../lib/GUI.pm:2473 +#: ../lib/GUI.pm:2492 +msgid "Browse..." +msgstr "" + +#: ../lib/GUI.pm:1441 ../lib/GUI.pm:1554 ../lib/GUI.pm:1577 +msgid "Export CA Certificate" +msgstr "Exportar Certificado de la CA" + +#: ../lib/GUI.pm:1448 ../lib/GUI.pm:2099 ../lib/GUI.pm:2318 +msgid "Valid for (Days):" +msgstr "Vlido para (Das):" + +#: ../lib/GUI.pm:1452 ../lib/GUI.pm:1581 ../lib/GUI.pm:1779 +msgid "Export Format:" +msgstr "Formato a Exportar:" + +#: ../lib/GUI.pm:1458 ../lib/GUI.pm:1587 +msgid "PEM" +msgstr "PEM" + +#: ../lib/GUI.pm:1467 ../lib/GUI.pm:1596 +msgid "DER" +msgstr "DER" + +#: ../lib/GUI.pm:1476 ../lib/GUI.pm:1605 +msgid "TXT" +msgstr "TXT" + +#: ../lib/GUI.pm:1507 ../lib/GUI.pm:1529 +msgid "Export CA Certificate Chain" +msgstr "Exportar Cadena de Certificados de la CA" + +#: ../lib/GUI.pm:1508 +msgid "Export CA Certificate Chain to File" +msgstr "Exportar cadena de Certificados de la CA a fichero" + +#: ../lib/GUI.pm:1555 +msgid "Export CA Certificate to File" +msgstr "Exportar Certificado de la CA a fichero" + +#: ../lib/GUI.pm:1635 ../lib/GUI.pm:1636 +msgid "Export Key without Passphrase" +msgstr "Exportar Clave sin Password" + +#: ../lib/GUI.pm:1640 +msgid "I hope you know what you're doing?" +msgstr "Espero que sepa lo que hace?" + +#: ../lib/GUI.pm:1644 +msgid "The Key Passphrase is needed for decryption of the Key" +msgstr "Se necesita el Password para descifrar la Clave" + +#: ../lib/GUI.pm:1653 +msgid "Password:" +msgstr "Password:" + +#: ../lib/GUI.pm:1679 ../lib/GUI.pm:1700 +msgid "Import Request from File" +msgstr "Importar Peticin de un fichero" + +#: ../lib/GUI.pm:1721 ../lib/GUI.pm:1759 ../lib/GUI.pm:2911 +msgid "Export Certificate" +msgstr "Exportar Certificado" + +#: ../lib/GUI.pm:1723 ../lib/GUI.pm:1761 ../lib/GUI.pm:2868 +msgid "Export Key" +msgstr "Exportar Clave" + +#: ../lib/GUI.pm:1726 +msgid "Invalid mode for show_export_dialog(): " +msgstr "Modo erroneo para show_export_dialog():" + +#: ../lib/GUI.pm:1743 +msgid "Export Certificate to File" +msgstr "Exportar Certificado a Fichero" + +#: ../lib/GUI.pm:1745 +msgid "Export Key to File" +msgstr "Exportar Clave a Fichero" + +#: ../lib/GUI.pm:1783 +msgid "PEM (Certificate)" +msgstr "PEM (Certificado)" + +#: ../lib/GUI.pm:1785 +msgid "PEM (Key)" +msgstr "PEM (Clave)" + +#: ../lib/GUI.pm:1794 +msgid "DER (Certificate)" +msgstr "DER (Certificado)" + +#: ../lib/GUI.pm:1796 +msgid "DER (Key without Passphrase)" +msgstr "DER (Clave sin Password)" + +#: ../lib/GUI.pm:1804 +msgid "PKCS#12 (Certificate & Key)" +msgstr "PKCS#12 (Certificado & Clave)" + +#: ../lib/GUI.pm:1811 +msgid "Zip (Certificate & Key)" +msgstr "Zip (Certificado & Clave)" + +#: ../lib/GUI.pm:1821 +#, fuzzy +msgid "Tar (Certificate & Key)" +msgstr "Zip (Certificado & Clave)" + +#: ../lib/GUI.pm:1833 +msgid "TXT (Certificate)" +msgstr "TXT (Certificado)" + +#: ../lib/GUI.pm:1839 +#, fuzzy +msgid "Without Passphrase (PEM/PKCS#12)" +msgstr "Sin Password (PEM)" + +#: ../lib/GUI.pm:1845 ../lib/GUI.pm:1872 ../lib/GUI.pm:1891 ../lib/GUI.pm:2018 +#: ../lib/GUI.pm:2043 ../lib/GUI.pm:2196 +msgid "Yes" +msgstr "S" + +#: ../lib/GUI.pm:1850 ../lib/GUI.pm:1877 ../lib/GUI.pm:1896 ../lib/GUI.pm:2024 +#: ../lib/GUI.pm:2049 ../lib/GUI.pm:2202 +msgid "No" +msgstr "No" + +#: ../lib/GUI.pm:1860 +msgid "Include Key (PEM)" +msgstr "" + +#: ../lib/GUI.pm:1865 +#, fuzzy +msgid "Include Certificate (PEM)" +msgstr "Certificado de la CA (PEM/DER):" + +#: ../lib/GUI.pm:1885 +#, fuzzy +msgid "Include Fingerprint (PEM)" +msgstr "Huella Digital (MD5)" + +#: ../lib/GUI.pm:1993 ../lib/GUI.pm:1994 +msgid "Export to PKCS#12" +msgstr "Exportar a PKCS#12" + +#: ../lib/GUI.pm:2001 +msgid "Key Password:" +msgstr "Password Clave:" + +#: ../lib/GUI.pm:2005 +msgid "Export Password:" +msgstr "Exportar Password:" + +#: ../lib/GUI.pm:2008 +msgid "Friendly Name:" +msgstr "" + +#: ../lib/GUI.pm:2012 +#, fuzzy +msgid "Without Passphrase" +msgstr "Sin Password (PEM)" + +#: ../lib/GUI.pm:2037 +msgid "Add CA Certificate to PKCS#12 structure" +msgstr "Aadir Certificado de la CA a la estructura del PKCS#12" + +#: ../lib/GUI.pm:2085 ../lib/GUI.pm:3068 +msgid "Sign Request" +msgstr "Firmar Peticin" + +#: ../lib/GUI.pm:2085 +msgid "Sign Request/Create Certificate" +msgstr "Firmar Peticin/Crear Certificado" + +#: ../lib/GUI.pm:2110 ../lib/GUI.pm:2155 +msgid "Subject alternative name (IP Address):" +msgstr "Nombre asunto alternativo (Direccin IP):" + +#: ../lib/GUI.pm:2113 ../lib/GUI.pm:2158 +msgid "Subject alternative name (DNS Name):" +msgstr "Nombre asunto alternativo (Nombre DNS):" + +#: ../lib/GUI.pm:2116 ../lib/GUI.pm:2164 +#, fuzzy +msgid "Subject alternative name (raw):" +msgstr "Nombre asunto alternativo (raw):" + +#: ../lib/GUI.pm:2124 ../lib/GUI.pm:2172 +msgid "Extended Key Usage:" +msgstr "Uso Clave (extendido):" + +#: ../lib/GUI.pm:2131 +msgid "Netscape SSL Server Name:" +msgstr "Nombre Servidor Netscape SSL:" + +#: ../lib/GUI.pm:2138 ../lib/GUI.pm:2179 +msgid "Netscape Revocation URL:" +msgstr "URL Revocacin Netscape" + +#: ../lib/GUI.pm:2145 ../lib/GUI.pm:2186 +msgid "Netscape Renewal URL:" +msgstr "URL Renovacin Netscape:" + +#: ../lib/GUI.pm:2161 +msgid "Subject alternative name (eMail Address):" +msgstr "Nombre asunto alternativo (Direccin eMail):" + +#: ../lib/GUI.pm:2208 +msgid "Add eMail Address to Subject DN:" +msgstr "Aadir Direccin eMail al Asunto DN:" + +#: ../lib/GUI.pm:2238 ../lib/GUI.pm:2242 +msgid "Create CA" +msgstr "Crear CA" + +#: ../lib/GUI.pm:2238 +msgid "Create a new Sub CA" +msgstr "Crear una nueva Sub CA" + +#: ../lib/GUI.pm:2242 +msgid "Create a new CA" +msgstr "Crear una CA nueva" + +#: ../lib/GUI.pm:2255 +msgid "CA Password (for creating the new CA):" +msgstr "Password CA (para crear la nueva CA):" + +#: ../lib/GUI.pm:2266 ../lib/GUI.pm:2403 +msgid "Name (for local storage):" +msgstr "Nombre (para almacenarlo localmente):" + +#: ../lib/GUI.pm:2273 +msgid "Data for CA Certificate" +msgstr "Informacin para el Certificado de la CA" + +#: ../lib/GUI.pm:2282 +msgid "Common Name (for the CA):" +msgstr "Nombre Comn (para la CA):" + +#: ../lib/GUI.pm:2290 +msgid "Password (needed for signing):" +msgstr "Password (necesario para firmar):" + +#: ../lib/GUI.pm:2382 +msgid "Import an existing CA into TinyCA" +msgstr "Importar una CA exitente" + +#: ../lib/GUI.pm:2393 +msgid "Password of the private CA key (Needed for import):" +msgstr "Password de la Clave privada (Necesario para importar):" + +#: ../lib/GUI.pm:2407 +msgid "New password for the CA:" +msgstr "Nuevo password para la CA:" + +#: ../lib/GUI.pm:2411 +msgid "Confirm password:" +msgstr "Confirmar Password:" + +#: ../lib/GUI.pm:2416 +msgid "Files/Directories to import" +msgstr "Fichers/Directorios a importar" + +#: ../lib/GUI.pm:2424 +msgid "CA Certificate (PEM/DER):" +msgstr "Certificado de la CA (PEM/DER):" + +#: ../lib/GUI.pm:2443 +msgid "CA private key (PEM/DER):" +msgstr "Clave privada de la CA (PEM/DER):" + +#: ../lib/GUI.pm:2457 +#, fuzzy +msgid "Import CA private Key" +msgstr "Importar clave privada de CA" + +#: ../lib/GUI.pm:2462 +#, fuzzy +msgid "OpenSSL Index File (index.txt):" +msgstr "Fichero ndice (index.txt):" + +#: ../lib/GUI.pm:2476 +msgid "Import Index File" +msgstr "Importar fichero ndice" + +#: ../lib/GUI.pm:2481 +msgid "Directory containing certificates (PEM/DER):" +msgstr "Directorio que contiene los Certificados (PEM/DER):" + +#: ../lib/GUI.pm:2495 +#, fuzzy +msgid "Import Certificates from directory" +msgstr "Importar Certificados de directorio" + +#: ../lib/GUI.pm:2509 +msgid "You are kidding, are you??" +msgstr "Est bromeando, verdad?" + +#: ../lib/GUI.pm:2531 +#, fuzzy +msgid "Spanish: Ramon Pons Vivanco " +msgstr "Castellano: Ramon Pons Vivanco " + +#: ../lib/GUI.pm:2532 +#, fuzzy +msgid "Czech: Robert Wolf " +msgstr "Checo: Robert Wolf " + +#: ../lib/GUI.pm:2533 +msgid "French: Thibault Le Meur " +msgstr "" + +#: ../lib/GUI.pm:2549 +msgid "Do you really want to delete the selected Request?" +msgstr "Est seguro de que desea eliminar las Peticiones seleccionadas?" + +#: ../lib/GUI.pm:2551 +msgid "Do you really want to delete the selected Key?" +msgstr "Est seguro de que desea eliminar las Claves seleccionadas?" + +#: ../lib/GUI.pm:2553 +msgid "Do you really want to delete the selected Certificate?" +msgstr "Est seguro de que desea eliminar los Certificados seleccionados?" + +#: ../lib/GUI.pm:2603 +#, fuzzy +msgid "Overwrite Request/Key" +msgstr "Eliminar Peticin" + +#: ../lib/GUI.pm:2609 +msgid "The Key or the Request is already existing!" +msgstr "La Clave o la Peticin ya existen!" + +#: ../lib/GUI.pm:2614 +#, fuzzy +msgid "You won't be able to sign this Request" +msgstr "no podr firmar la Peticin!" + +#: ../lib/GUI.pm:2619 +#, fuzzy +msgid "if the corresponding certificate is still valid" +msgstr "Si el Certificado correspondiente no ha caducado o ha sido revocado " + +#: ../lib/GUI.pm:2636 +msgid "The Certificate will be longer valid than your CA!" +msgstr "El Certificado tendr mayor duracin que la CA!" + +#: ../lib/GUI.pm:2638 +msgid "This may cause problems with some software!!" +msgstr "Esto puede causar problemas con algunos programas!!" + +#: ../lib/GUI.pm:2653 +msgid "Expirationdate Warning" +msgstr "Advertencia - Caducado" + +#: ../lib/GUI.pm:2688 ../lib/GUI/WORDS.pm:69 +msgid "Serial" +msgstr "Nmero de Serie" + +#: ../lib/GUI.pm:2690 ../lib/GUI/WORDS.pm:70 ../lib/GUI/X509_browser.pm:175 +msgid "Status" +msgstr "Estado" + +#: ../lib/GUI.pm:2691 ../lib/GUI/WORDS.pm:64 +msgid "Expiration Date" +msgstr "Fecha Caducidad" + +#: ../lib/GUI.pm:2692 +#, fuzzy +msgid "Revocation Date" +msgstr "Fecha Creacin" + +#: ../lib/GUI.pm:2693 +#, fuzzy +msgid "Revocation Reason" +msgstr "Razn Revocacin:" + +#: ../lib/GUI.pm:2719 ../lib/OpenSSL.pm:705 +msgid "EXPIRED" +msgstr "CADUCADO" + +#: ../lib/GUI.pm:2721 ../lib/OpenSSL.pm:718 +msgid "REVOKED" +msgstr "REVOCADO" + +#: ../lib/GUI.pm:2741 +msgid "CA History" +msgstr "" + +#: ../lib/GUI.pm:2775 +msgid "Overwrite Certificate" +msgstr "Sobreescribrir Certificado" + +#: ../lib/GUI.pm:2781 +#, fuzzy +msgid "There seems to be a certificate with the same Subject already." +msgstr "Parece que ya hay un Certificado." + +#: ../lib/GUI.pm:2786 +msgid "" +"Creating a new one (overwrite) will fail if it's not revoked or expired!" +msgstr "" +"Al crear uno nuevo (sobreescribir) fallar si no est revocado o ha " +"caducado!" + +#: ../lib/GUI.pm:2792 +msgid "Really try to overwrite the Certificate?" +msgstr "Quiere realmente sobreescribir el Certificado?" + +#: ../lib/GUI.pm:2825 +msgid "Convert CA" +msgstr "Convertir CA" + +#: ../lib/GUI.pm:2833 +msgid "" +"This CA seems to be created with openssl 0.9.6x. And it seems like you have " +"switched to openssl 0.9.7x." +msgstr "" +"Est CA parece que ha sido creada con OpenSSL 0.9.6x. Y parece que ha " +"cambiado a OpenSSL 0.9.7x." + +#: ../lib/GUI.pm:2841 +msgid "" +"You won't be able to revoke the existing certificates without converting the " +"index file of this CA to the new format." +msgstr "" +"No podr revocar los Certificados existentes sin convertir el fichero ndice " +"de esta CA al nuevo formato." + +#: ../lib/GUI.pm:2849 +msgid "" +"Attention: it will not be easy to switch back, this has to be done manually" +msgstr "" +"Atencin: no ser fcil volver atras, esto tiene que hacerse manualmente" + +#: ../lib/GUI.pm:2875 +msgid "Delete Key" +msgstr "Eliminar Clave" + +#: ../lib/GUI.pm:2904 +msgid "View Certificate" +msgstr "Ver Certificado" + +#: ../lib/GUI.pm:2925 +#, fuzzy +msgid "Renew Certificate" +msgstr "Revocar Certificado" + +#: ../lib/GUI.pm:2933 +msgid "Delete Certificate" +msgstr "Eliminar Certificado" + +#: ../lib/GUI.pm:2956 +msgid "Create Key and Certificate (Server)" +msgstr "Crear Clave y Certificado (Servidor)" + +#: ../lib/GUI.pm:2962 +msgid "Create Key and Certificate (Client)" +msgstr "Crear Clave y Certificado (Cliente)" + +#: ../lib/GUI.pm:2983 +#, fuzzy +msgid "Renew Certificate (Server)" +msgstr "Renovar Certificado" + +#: ../lib/GUI.pm:2990 +#, fuzzy +msgid "Renew Certificate (Client)" +msgstr "Renovar Certificado" + +#: ../lib/GUI.pm:3012 +msgid "Sign Request (Server)" +msgstr "Firmar Peticin (Servidor)" + +#: ../lib/GUI.pm:3019 +msgid "Sign Request (Client)" +msgstr "Firmar Peticin (Cliente)" + +#: ../lib/GUI.pm:3047 +msgid "View Request" +msgstr "Ver Peticin" + +#: ../lib/GUI.pm:3054 +msgid "New Request" +msgstr "Nueva Peticin" + +#: ../lib/GUI.pm:3076 +msgid "Delete Request" +msgstr "Eliminar Peticin" + +#: ../lib/HELPERS.pm:207 +#, c-format +msgid "Can't write exportdir: %s, %s" +msgstr "No se puede escribir en el directorio para exportar: %s: %s" + +#: ../lib/KEY.pm:45 ../lib/KEY.pm:137 +msgid "Please select a Key first" +msgstr "Por favor seleccione antes una Clave" + +#: ../lib/KEY.pm:54 +msgid "Key file not found:" +msgstr "Fichero de Claves no encontrado:" + +#: ../lib/KEY.pm:101 +msgid "Can't open key directory" +msgstr "No se puede abrir el directorio de Claves" + +#: ../lib/KEY.pm:194 +msgid "" +"Wrong password given\n" +"Decrypting of the Key failed\n" +"Export is not possible" +msgstr "" +"Password introducido incorrecto\n" +"Fall el descifrado de la Clave\n" +"No se puede exportar" + +#: ../lib/KEY.pm:199 +msgid "Converting failed, Export not possible" +msgstr "Conversin erronea, no se puede exportar" + +#: ../lib/KEY.pm:206 ../lib/KEY.pm:410 +#, c-format +msgid "Can't open Key file: %s: %s" +msgstr "No se puede abrir el fichero de Claves: %s: %s" + +#: ../lib/KEY.pm:239 +#, c-format +msgid "Key succesfully exported to %s" +msgstr "Clave exportada correctamente: %s" + +#: ../lib/KEY.pm:255 +msgid "Certificate is necessary for export as PKCS#12" +msgstr "Es necesario un Certificado para exportar como PKCS#12" + +#: ../lib/KEY.pm:305 +#, fuzzy, c-format +msgid "Certificate is necessary for export as %s file" +msgstr "Es necesario un Certificado para exportar como fichero Zip" + +#: ../lib/KEY.pm:330 +msgid "Can't read Key file" +msgstr "No se puede leer el fichero con la Clave" + +#: ../lib/KEY.pm:392 +#, c-format +msgid "Invalid format for export requested: %s" +msgstr "Formato no vlido para exportar una Peticin: %s" + +#: ../lib/KEY.pm:398 +msgid "Something Failed ??" +msgstr "Ha fallado algo??" + +#: ../lib/KEY.pm:448 +#, c-format +msgid "" +"Can't open Key file:\n" +"%s" +msgstr "" +"No se puede abrir el fichero de Claves:\n" +"%s" + +#: ../lib/KEY.pm:485 +msgid "The password for your old CA Key is wrong" +msgstr "El password de la Clave antigua no es correcto" + +#: ../lib/OpenSSL.pm:73 +msgid "Creating DSA key in progress..." +msgstr "Creacin de una clave DSA en progreso..." + +#: ../lib/OpenSSL.pm:107 +msgid "Creating RSA key in progress..." +msgstr "Creacin de una clave RSA en progreso..." + +#: ../lib/OpenSSL.pm:456 +#, c-format +msgid "Can't open CRL '%s': %s" +msgstr "No se puede abrir CRL '%s': %s" + +#: ../lib/OpenSSL.pm:471 ../lib/OpenSSL.pm:484 +msgid "Error converting CRL" +msgstr "Error al convertir CRL" + +#: ../lib/OpenSSL.pm:582 ../lib/OpenSSL.pm:595 +msgid "Error converting Certificate" +msgstr "Error al convetir Certificado" + +#: ../lib/OpenSSL.pm:655 ../lib/OpenSSL.pm:672 +msgid "Error reading fingerprint from Certificate" +msgstr "Error al leer la huella digital del Certificado" + +#: ../lib/OpenSSL.pm:690 +msgid "Error reading subject from Certificate" +msgstr "Error al leer el asunto del Certificado" + +#: ../lib/OpenSSL.pm:700 +msgid "Can't read CRL" +msgstr "No se puede leer la CRL" + +#: ../lib/OpenSSL.pm:723 +msgid "UNDEFINED" +msgstr "SIN DEFINIR" + +#: ../lib/OpenSSL.pm:750 +#, c-format +msgid "Can't open Request file %s: %s" +msgstr "No se puede abrir fichero de Peticin %s: %s" + +#: ../lib/OpenSSL.pm:767 ../lib/OpenSSL.pm:781 ../lib/REQ.pm:685 +msgid "Error converting Request" +msgstr "Error al convertir Peticin" + +#: ../lib/OpenSSL.pm:863 +#, c-format +msgid "Can't open file %s: %s" +msgstr "No se puede abrir fichero %s: %s" + +#: ../lib/OpenSSL.pm:981 ../lib/OpenSSL.pm:1013 +#, c-format +msgid "Can't read index %s: %s" +msgstr "No se puede leer el ndice %s: %s" + +#: ../lib/OpenSSL.pm:1023 +#, c-format +msgid "Can't write index %s: %s" +msgstr "No se puede escribir el ndice %s: %s" + +#: ../lib/REQ.pm:58 +#, c-format +msgid "Strange value for 'opts': %s" +msgstr "Valor extrao para 'opts': %s" + +#: ../lib/REQ.pm:101 +msgid "Please specify at least Common Name " +msgstr "Por favor expecifique al menos el Nombre Comn " + +#: ../lib/REQ.pm:102 +msgid "and Password" +msgstr "y Password" + +#: ../lib/REQ.pm:246 ../lib/REQ.pm:376 +msgid "Request file not found" +msgstr "Fichero de Peticin no encontrado" + +#: ../lib/REQ.pm:299 +msgid "Can't open Request directory" +msgstr "No se puede abrir el directorio de Peticiones" + +#: ../lib/REQ.pm:320 +#, c-format +msgid " Read Request: %s" +msgstr " Lectura de la Peticin: %s" + +#: ../lib/REQ.pm:414 +#, fuzzy +msgid "Can't read Request file" +msgstr "No se puede leer el fichero de Peticin:" + +#: ../lib/REQ.pm:458 +msgid "Can't read serial" +msgstr "No se puede leer el nmero de serie" + +#: ../lib/REQ.pm:531 +msgid "" +"Wrong CA password given\n" +"Signing of the Request failed" +msgstr "" +"El password de la CA introducido es erroneo\n" +"Fall la firma de la Peticin" + +#: ../lib/REQ.pm:537 +msgid "" +"CA Key not found\n" +"Signing of the Request failed" +msgstr "" +"Clave de la CA no encontrada\n" +"Fall la firma de la Peticin" + +#: ../lib/REQ.pm:543 +msgid "" +"Certificate already existing\n" +"Signing of the Request failed" +msgstr "" +"El Certificado ya existe\n" +"Fall la firma de la Peticin" + +#: ../lib/REQ.pm:549 +msgid "" +"Invalid IP Address given\n" +"Signing of the Request failed" +msgstr "" +"Direccin IP introducida erronea\n" +"Fall la firma de la Peticin" + +#: ../lib/REQ.pm:556 ../lib/REQ.pm:574 +msgid "Signing of the Request failed" +msgstr "Fall la firma de la Peticin" + +#: ../lib/REQ.pm:581 +msgid "Can't read Certificate file" +msgstr "No se puede leer el fichero del Certificado" + +#: ../lib/REQ.pm:587 ../lib/REQ.pm:597 +msgid "Can't write Certificate file" +msgstr "No se puede escribir el fichero del Certificado" + +#: ../lib/REQ.pm:609 +msgid "" +"Request signed succesfully.\n" +"Certificate created" +msgstr "" +"Peticin firmada correctamente.\n" +"Certificado creado." + +#: ../lib/REQ.pm:650 +msgid "Please select a Request file first" +msgstr "Por favor seleccione un fichero de Peticin antes" + +#: ../lib/REQ.pm:656 +msgid "Can't find Request file: " +msgstr "No se puede encontrar el fichero: " + +#: ../lib/REQ.pm:662 +msgid "Can't read Request file:" +msgstr "No se puede leer el fichero de Peticin:" + +#: ../lib/REQ.pm:708 +msgid "Parsing Request failed" +msgstr "Fall el anlisis de la Peticin" + +#: ../lib/TCONFIG.pm:42 +msgid "Please select a CA first" +msgstr "Por favor seleccione una CA antes" + +#: ../lib/TCONFIG.pm:49 +msgid "Can't open configuration" +msgstr "No se puede abrir la configuracin" + +#: ../lib/TCONFIG.pm:284 ../lib/TCONFIG.pm:299 ../lib/GUI/TCONFIG.pm:47 +#: ../lib/GUI/TCONFIG.pm:1302 +msgid "Can't get CA name" +msgstr "No se puede obtener el nombre de la CA" + +#: ../lib/TCONFIG.pm:327 +msgid "Can't open configfile" +msgstr "No se puede abrir el fichero de configuracin" + +#: ../lib/GUI/HELPERS.pm:54 ../lib/GUI/HELPERS.pm:94 ../lib/GUI/HELPERS.pm:135 +#, fuzzy +msgid "Command Details" +msgstr "Detalles" + +#: ../lib/GUI/HELPERS.pm:305 +msgid "Request Files (*.pem, *.der, *.req)" +msgstr "" + +#: ../lib/GUI/HELPERS.pm:312 +msgid "All Files (*.*)" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:74 +msgid "" +"All Settings are written unchanged to openssl.conf.\n" +"So please study the documentation of OpenSSL if you don't know exactly what " +"to do.\n" +"If you are still unsure - keep the defaults and everything is expected to " +"work fine." +msgstr "" +"Toda la configuracin se escribe sin cambios en openssl.conf.\n" +"As que por favor consulte la documentacin de OpenSSl si no sabe " +"exactamente qu hacer.\n" +"Si todava no sabe qu hacer, mantenga la configuracin por defecto y todo " +"funcionar bien." + +#: ../lib/GUI/TCONFIG.pm:108 ../lib/GUI/TCONFIG.pm:116 +msgid "OpenSSL Configuration" +msgstr "Configuracin OpenSSL" + +#: ../lib/GUI/TCONFIG.pm:129 +msgid "Only change these options, if you really know, what you are doing!!" +msgstr "Cambie estas opciones slo si realmente sabe lo que est haciendo!!" + +#: ../lib/GUI/TCONFIG.pm:137 +msgid "You should be aware, that some options may break some crappy software!!" +msgstr "" +"Sea consciente: algunas opciones pueden producir fallos en programas " +"incorrectos!!" + +#: ../lib/GUI/TCONFIG.pm:146 ../lib/GUI/TCONFIG.pm:1348 +msgid "If you are unsure: leave the defaults untouched" +msgstr "Si no est seguro: deje las opciones por defecto" + +#: ../lib/GUI/TCONFIG.pm:182 +msgid "These Settings are passed to OpenSSL for creating Server Certificates" +msgstr "" +"Estas opciones se le pasan a OpenSSL para crear Certificados de Servidor" + +#: ../lib/GUI/TCONFIG.pm:187 ../lib/GUI/TCONFIG.pm:612 +#: ../lib/GUI/TCONFIG.pm:1019 ../lib/GUI/TCONFIG.pm:1239 +#: ../lib/GUI/TCONFIG.pm:1340 +msgid "Multiple Values can be separated by \",\"" +msgstr "Los valores multiples se pueden separar por \",\"" + +#: ../lib/GUI/TCONFIG.pm:207 ../lib/GUI/TCONFIG.pm:209 +msgid "Server Certificate Settings" +msgstr "Opciones Certificado Servidor" + +#: ../lib/GUI/TCONFIG.pm:215 ../lib/GUI/TCONFIG.pm:638 +#: ../lib/GUI/TCONFIG.pm:1047 ../lib/GUI/TCONFIG.pm:1462 +msgid "Subject alternative name (subjectAltName):" +msgstr "Nombre asunto alternativo (subjectAltName):" + +#: ../lib/GUI/TCONFIG.pm:312 ../lib/GUI/TCONFIG.pm:744 +#: ../lib/GUI/TCONFIG.pm:1107 ../lib/GUI/TCONFIG.pm:1358 +msgid "Key Usage (keyUsage):" +msgstr "Uso Clave (keyUsage):" + +#: ../lib/GUI/TCONFIG.pm:391 ../lib/GUI/TCONFIG.pm:819 +msgid "Extended Key Usage (extendedKeyUsage):" +msgstr "Uso Clave Extendida (extendedKeyUsage):" + +#: ../lib/GUI/TCONFIG.pm:467 ../lib/GUI/TCONFIG.pm:894 +#: ../lib/GUI/TCONFIG.pm:1076 ../lib/GUI/TCONFIG.pm:1431 +msgid "Netscape Certificate Type (nsCertType):" +msgstr "Tipo Certificado Netscape (nsCertType):" + +#: ../lib/GUI/TCONFIG.pm:496 +msgid "Netscape SSL Server Name (nsSslServerName):" +msgstr "Nombre Servidor SSL Netscape (nsSslServerName):" + +#: ../lib/GUI/TCONFIG.pm:521 ../lib/GUI/TCONFIG.pm:924 +#: ../lib/GUI/TCONFIG.pm:1182 +msgid "Netscape Revocation URL (nsRevocationUrl):" +msgstr "URL Revocacin Netscape (nsRevocationUrl):" + +#: ../lib/GUI/TCONFIG.pm:546 ../lib/GUI/TCONFIG.pm:948 +msgid "Netscape Renewal URL (nsRenewalUrl):" +msgstr "URL Renovacin Netscape (nsRenewalUrl):" + +#: ../lib/GUI/TCONFIG.pm:607 +msgid "These Settings are passed to OpenSSL for creating Client Certificates" +msgstr "Estas opciones se pasan a OpenSSL para crear Certificados de Cliente" + +#: ../lib/GUI/TCONFIG.pm:632 +msgid "Client Certificate Settings" +msgstr "Opciones Certificado Cliente" + +#: ../lib/GUI/TCONFIG.pm:1014 +msgid "These Settings are passed to OpenSSL for creating CA Certificates" +msgstr "Estas opciones se pasan a OpenSSL para crear Certificados de la CA" + +#: ../lib/GUI/TCONFIG.pm:1039 ../lib/GUI/TCONFIG.pm:1041 +msgid "CA Certificate Settings" +msgstr "Opciones Certificado CA" + +#: ../lib/GUI/TCONFIG.pm:1234 +msgid "" +"These Settings are passed to OpenSSL for creating Certificate Revocation " +"Lists" +msgstr "" +"Estas opciones se pasan a OpenSSL para crear Listas de Revocacin de " +"Certificados" + +#: ../lib/GUI/TCONFIG.pm:1260 +msgid "Revocation List Settings" +msgstr "Opciones Lista Revocacin" + +#: ../lib/GUI/TCONFIG.pm:1322 +msgid "CA Configuration" +msgstr "Configuracin CA" + +#: ../lib/GUI/TCONFIG.pm:1330 +msgid "These Settings are passed to OpenSSL for creating this CA Certificate" +msgstr "Estas opciones se pasan a OpenSSL para crear este Certificado de la CA" + +#: ../lib/GUI/TCONFIG.pm:1335 +msgid "and the CA Certificates of every SubCA, created with this CA." +msgstr "y el Certificado de la CA y de todas las SubCA creadas con esta CA." + +#: ../lib/GUI/WORDS.pm:26 ../lib/GUI/WORDS.pm:73 +msgid "Not set" +msgstr "No establecido" + +#: ../lib/GUI/WORDS.pm:27 ../lib/GUI/WORDS.pm:74 +msgid "Ask User" +msgstr "Preguntar Usuario" + +#: ../lib/GUI/WORDS.pm:28 ../lib/GUI/WORDS.pm:75 +msgid "critical" +msgstr "crtico" + +#: ../lib/GUI/WORDS.pm:29 ../lib/GUI/WORDS.pm:76 +msgid "not critical" +msgstr "no crtico" + +#: ../lib/GUI/WORDS.pm:30 ../lib/GUI/WORDS.pm:77 +msgid "Copy Email" +msgstr "Copia Email" + +#: ../lib/GUI/WORDS.pm:31 ../lib/GUI/WORDS.pm:78 +msgid "raw" +msgstr "raw" + +#: ../lib/GUI/WORDS.pm:32 ../lib/GUI/WORDS.pm:79 +msgid "DNS Name" +msgstr "Nombre DNS" + +#: ../lib/GUI/WORDS.pm:33 ../lib/GUI/WORDS.pm:81 +msgid "IP Address" +msgstr "Direccin IP" + +#: ../lib/GUI/WORDS.pm:34 ../lib/GUI/WORDS.pm:80 +msgid "Email" +msgstr "Email" + +#: ../lib/GUI/WORDS.pm:35 ../lib/GUI/WORDS.pm:82 +msgid "SSL Server" +msgstr "Servidor SSL" + +#: ../lib/GUI/WORDS.pm:36 ../lib/GUI/WORDS.pm:83 +msgid "SSL Server, SSL Client" +msgstr "Servidor SSL, Cliente SSL" + +#: ../lib/GUI/WORDS.pm:37 ../lib/GUI/WORDS.pm:84 +msgid "Key Encipherment" +msgstr "Cifrado Clave" + +#: ../lib/GUI/WORDS.pm:38 ../lib/GUI/WORDS.pm:85 +msgid "Digital Signature" +msgstr "Firma Digital" + +#: ../lib/GUI/WORDS.pm:39 ../lib/GUI/WORDS.pm:86 +msgid "Key Encipherment, Digital Signature" +msgstr "Cifrado Clave, Firma Digital" + +#: ../lib/GUI/WORDS.pm:40 ../lib/GUI/WORDS.pm:87 +msgid "Object Signing" +msgstr "Firmar Objeto" + +#: ../lib/GUI/WORDS.pm:41 ../lib/GUI/WORDS.pm:91 +msgid "SSL Client, Object Signing" +msgstr "Cliente SSL, Firmar Objeto" + +#: ../lib/GUI/WORDS.pm:42 ../lib/GUI/WORDS.pm:89 +msgid "SSL Client, Email(S/MIME)" +msgstr "Cliente SSL, Email(S/MIME)" + +#: ../lib/GUI/WORDS.pm:43 ../lib/GUI/WORDS.pm:90 +msgid "SSL Client" +msgstr "Cliente SSL" + +#: ../lib/GUI/WORDS.pm:44 ../lib/GUI/WORDS.pm:88 +msgid "Email(S/MIME)" +msgstr "Email(S/MIME)" + +#: ../lib/GUI/WORDS.pm:45 ../lib/GUI/WORDS.pm:92 +msgid "SSL Client, Email, Object Signing" +msgstr "Cliente SSL, Email, Firmar Objeto" + +#: ../lib/GUI/WORDS.pm:46 ../lib/GUI/WORDS.pm:93 +msgid "Object Signing CA" +msgstr "Firmar Objeto CA" + +#: ../lib/GUI/WORDS.pm:47 ../lib/GUI/WORDS.pm:94 +msgid "S/MIME CA" +msgstr "S/MIME CA" + +#: ../lib/GUI/WORDS.pm:48 ../lib/GUI/WORDS.pm:95 +msgid "SSL CA" +msgstr "SSL CA" + +#: ../lib/GUI/WORDS.pm:49 ../lib/GUI/WORDS.pm:96 +msgid "SSL CA, S/MIME CA" +msgstr "SSL CA, S/MIME CA" + +#: ../lib/GUI/WORDS.pm:50 ../lib/GUI/WORDS.pm:97 +msgid "SSL CA, Object Signing CA" +msgstr "SSL CA, Firmar Objeto CA" + +#: ../lib/GUI/WORDS.pm:51 ../lib/GUI/WORDS.pm:98 +msgid "S/MIME CA, Object Signing CA" +msgstr "S/MIME CA, Firmar Objeto CA" + +#: ../lib/GUI/WORDS.pm:52 ../lib/GUI/WORDS.pm:99 +msgid "SSL CA, S/MIME CA, Object Signing CA" +msgstr "SSL CA, S/MIME CA, Firmar Objeto CA" + +#: ../lib/GUI/WORDS.pm:53 ../lib/GUI/WORDS.pm:100 +msgid "Certificate Signing" +msgstr "Firmar Certificado" + +#: ../lib/GUI/WORDS.pm:54 ../lib/GUI/WORDS.pm:101 +msgid "CRL Signing" +msgstr "Firmar CRL" + +#: ../lib/GUI/WORDS.pm:55 ../lib/GUI/WORDS.pm:102 +msgid "Certificate Signing, CRL Signing" +msgstr "Firmar Certificado, Firmar CRL" + +#: ../lib/GUI/WORDS.pm:63 +msgid "Creation Date" +msgstr "Fecha Creacin" + +#: ../lib/GUI/WORDS.pm:66 +msgid "Public Key Algorithm" +msgstr "Algoritmo de Clave Publica" + +#: ../lib/GUI/WORDS.pm:67 +msgid "Signature Algorithm" +msgstr "Algoritmo de Firma" + +#: ../lib/GUI/WORDS.pm:71 ../lib/GUI/X509_infobox.pm:80 +msgid "Fingerprint (MD5)" +msgstr "Huella Digital (MD5)" + +#: ../lib/GUI/WORDS.pm:72 ../lib/GUI/X509_infobox.pm:89 +msgid "Fingerprint (SHA1)" +msgstr "Huella Digital (SHA1)" + +#: ../lib/GUI/X509_browser.pm:448 +msgid "Certificate Information" +msgstr "Informacin Certificado" + +#: ../lib/GUI/X509_browser.pm:452 +msgid "Request Information" +msgstr "Informacin Peticin" + +#: ../lib/GUI/X509_browser.pm:571 +#, fuzzy +msgid "Invalid browser mode for selection_fname():" +msgstr "Modo de exploracin erroneo para selection_dn()" + +#: ../lib/GUI/X509_browser.pm:571 ../lib/GUI/X509_browser.pm:607 +#: ../lib/GUI/X509_browser.pm:656 ../lib/GUI/X509_browser.pm:677 +#: ../lib/GUI/X509_browser.pm:698 ../lib/GUI/X509_browser.pm:725 +msgid " " +msgstr " " + +#: ../lib/GUI/X509_browser.pm:607 +msgid "Invalid browser mode for selection_dn():" +msgstr "Modo de exploracin erroneo para selection_dn()" + +#: ../lib/GUI/X509_browser.pm:656 ../lib/GUI/X509_browser.pm:677 +msgid "Invalid browser mode for selection_cn():" +msgstr "Modo de exploracin erroneo para selection_cn()" + +#: ../lib/GUI/X509_browser.pm:698 +msgid "Invalid browser mode for selection_status():" +msgstr "Modo de exploracin para selection_status():" + +#: ../lib/GUI/X509_browser.pm:725 +#, fuzzy +msgid "Invalid browser mode for selection_type():" +msgstr "Modo de exploracin erroneo para selection_dn()" + +#: ../tinyca2:63 +#, c-format +msgid "Can't execute %s.\n" +msgstr "No se puede ejecutar %s.\n" + +#: ../tinyca2:64 +msgid "Configure correct path to openssl in tinyca.\n" +msgstr "Configure correctamente la ruta de openssl en tinyca.\n" + +#: ../tinyca2:69 +msgid "zip command not found, support disabled.\n" +msgstr "comando zip no encontrado, soporte deshabilitado.\n" + +#: ../tinyca2:70 +msgid "Configure correct path to zip in tinyca.\n" +msgstr "Configure correctamente la ruta de zip en tinyca.\n" + +#: ../tinyca2:74 +#, fuzzy +msgid "tar command not found, support disabled.\n" +msgstr "comando zip no encontrado, soporte deshabilitado.\n" + +#: ../tinyca2:75 +#, fuzzy +msgid "Configure correct path to tar in tinyca.\n" +msgstr "Configure correctamente la ruta de zip en tinyca.\n" + +#: ../tinyca2:82 +msgid "Can't find templatedir.\n" +msgstr "No se puede encontrar el directorio de plantillas.\n" + +#: ../tinyca2:83 +msgid "Please configure correct path with templates in tinyca.\n" +msgstr "Por favor configure correctamente la ruta de plantillas en tinyca.\n" + +#~ msgid "Can't export PKCS#12 without passphrase" +#~ msgstr "No se puede exportar PKCS#12 sin Password" diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..59f27e3 --- /dev/null +++ b/po/fr.po @@ -0,0 +1,1999 @@ +# translation of fr.po to +# translation of es.po to spanish +# This file is distributed under the same license as the tinyca package. +# Copyright (C) 2004 Ramn Pons Vivanco +# Stephan Martin, 2006. +# +msgid "" +msgstr "" +"Project-Id-Version: fr\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-07-13 23:47+0200\n" +"PO-Revision-Date: 2006-02-18 23:11+0100\n" +"Last-Translator: Stephan Martin\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.10\n" + +#: ../lib/CA.pm:44 +msgid "error: can't open basedir: " +msgstr "erreur: impossible d'ouvrir le rpertoire: " + +#: ../lib/CA.pm:102 +msgid " Opening CA: " +msgstr " Ouverture de la CA: " + +#: ../lib/CA.pm:109 ../lib/CA.pm:270 +msgid "Invalid CA selected" +msgstr "CA selectionne invalide" + +#: ../lib/CA.pm:154 +msgid " Initializing OpenSSL" +msgstr " Initialisation d'OpenSSL" + +#: ../lib/CA.pm:160 +msgid " Check for CA Version" +msgstr " Vrification de la version de la CA" + +#: ../lib/CA.pm:167 ../lib/CA.pm:195 +msgid "Can't open index file: " +msgstr "Impossible d'ouvrir le fichier d'index: " + +#: ../lib/CA.pm:182 +msgid " Convert CA" +msgstr " Convertir la CA" + +#: ../lib/CA.pm:201 +msgid "Can't open index backup: " +msgstr "Impossible d'ouvrir la sauvegarde du fichier d'index: " + +#: ../lib/CA.pm:218 +msgid "This CA is converted for openssl 0.9.7x now." +msgstr "Cette CA est maintenant convertie pour openssl 0.9.7x." + +#: ../lib/CA.pm:220 +msgid "You will find a backup copy of the index file at: " +msgstr "Vous trouverez une copie de sauvegarde du fichier d'index ici: " + +#: ../lib/CA.pm:229 +msgid " Read Configuration" +msgstr " Lecture de la Configuration" + +#: ../lib/CA.pm:235 +msgid " Create GUI" +msgstr " Cration du GUI" + +#: ../lib/CA.pm:241 +msgid " Create Toolbar" +msgstr " Cration de la barre d'outils" + +#: ../lib/CA.pm:247 +msgid " Actual CA: " +msgstr " CA actuelle: " + +#: ../lib/CA.pm:332 +#, c-format +msgid "CA: %s deleted" +msgstr "CA: %s dtruite" + +#: ../lib/CA.pm:386 +msgid "Password of parent CA is needed for creating a Sub CA" +msgstr "" +"Le mot de passe de la CA parent est requis pour la cration d'une CA " +"intermdiaire" + +#: ../lib/CA.pm:395 +msgid "Name must be filled in and must" +msgstr "Le nom doit tre renseign" + +#: ../lib/CA.pm:396 +msgid " not contain Spaces" +msgstr " ne doit pas contenir d'espace" + +#: ../lib/CA.pm:408 +msgid "Please specify at least Common Name, " +msgstr "S'il vous plait renseignez au moins le Common Name, " + +#: ../lib/CA.pm:409 +msgid "Country and Password" +msgstr "Pays et mot de passe" + +#: ../lib/CA.pm:416 ../lib/REQ.pm:109 +msgid "Passwords don't match" +msgstr "Les mots de passe ne sont pas identiques" + +#: ../lib/CA.pm:424 ../lib/REQ.pm:120 +msgid "Country must be exact 2 letter code" +msgstr "Le Pays doit contenir un code sur 2 lettres" + +#: ../lib/CA.pm:428 +#, c-format +msgid "CA: %s already exists" +msgstr "La CA: %s existe dj" + +#: ../lib/CA.pm:468 +msgid "Name for storage must be filled in and must not contain spaces" +msgstr "Le nom doit tre renseign et ne doit pas contenir d'espace" + +#: ../lib/CA.pm:477 +msgid "You didn't give a password for the private CA key." +msgstr "" +"Vous n'avez pas donn de mot de passe pour protger la cl prive de la CA." + +#: ../lib/CA.pm:479 +msgid "The import will fail, if the key is encrypted." +msgstr "L'importation chouera si la cl est chiffre." + +#: ../lib/CA.pm:488 +msgid "Please give a new password for the CA" +msgstr "Veuillez donner un nouveau mot de passe pour la CA" + +#: ../lib/CA.pm:495 +msgid "New passwords don't match" +msgstr "Les nouveaux mots de passe ne sont pas identiques" + +#: ../lib/CA.pm:503 +msgid "Please give a CA certificate to import" +msgstr "" +"Veuillez renseigner le nom du fichier contenant le certificat de la CA " +"importer" + +#: ../lib/CA.pm:508 +#, c-format +msgid "" +"Can't read CA certificate file:\n" +"%s" +msgstr "" +"Impossible de lire le fichier de certificat de la CA:\n" +"%s" + +#: ../lib/CA.pm:518 +msgid "Please give a CA keyfile to import" +msgstr "" +"Veuillez renseigner le nom du fichier contenant la cl prive de la CA " +"importer" + +#: ../lib/CA.pm:523 +#, c-format +msgid "" +"Can't read CA key file:\n" +"%s" +msgstr "" +"Impossible de lire le fichier de cl prive de la CA:\n" +"%s" + +#: ../lib/CA.pm:535 +msgid "Please give an Index file to import.\n" +msgstr "Veuillez renseigner le nom du fichier d'index de la CA importer.\n" + +#: ../lib/CA.pm:536 +msgid "If you don't have an Index file, i'll try to generate one.\n" +msgstr "" +"Si vous ne disposez pas d'un fichier d'index, je tenterai d'en gnrer un.\n" + +#: ../lib/CA.pm:537 +msgid "Attention: This will cause all Certificates to show up as valid.\n" +msgstr "" +"Attention: Aprs cette opration tous les certificats seront affichs comme " +"tant valides.\n" + +#: ../lib/CA.pm:538 +msgid "Attention: Revoked Certificates will not be determined." +msgstr "Attention: Les certificats rvoqus ne seront plus affichs comme tel." + +#: ../lib/CA.pm:549 +#, c-format +msgid "" +"Can't read Index file:\n" +"%s" +msgstr "" +"Impossible de lire le fichier d'index:\n" +"%s" + +#: ../lib/CA.pm:562 +msgid "Please give a directory containing the certificates to import" +msgstr "" +"Veuillez donner le nom du rpertoire contenant les certificats importer" + +#: ../lib/CA.pm:567 +#, c-format +msgid "" +"Can't find certificate directory:\n" +"%s" +msgstr "" +"Impossible de trouver le rpertoire contenant les certificats:\n" +"%s" + +#: ../lib/CA.pm:578 +#, c-format +msgid "CA: %s already exists. Please choose another name" +msgstr "la CA: %s existe dj. Veuillez vhoisir un autre nom" + +#: ../lib/CA.pm:594 +msgid "Can't find X509v3 Basic Constraints in CA Certificate\n" +msgstr "" +"Impossible de trouver l'extension X509v3 Basic Constraints dans le " +"certificat de la CA\n" + +#: ../lib/CA.pm:595 +msgid "Import canceled" +msgstr "Importation annule" + +#: ../lib/CA.pm:601 +msgid "The selected CA Certificate is no valid CA certificate\n" +msgstr "Le certificat slectionn n'est pas un certificat de CA valide\n" + +#: ../lib/CA.pm:602 +#, c-format +msgid "X509v3 Basic Constraint is set to: %s" +msgstr "L'extension X509v3 Basic Constraint vaut: %s" + +#: ../lib/CA.pm:612 +#, c-format +msgid "" +"Can't open Index file:\n" +"%s" +msgstr "" +"Impossible d'ouvrir le fichier d'index:\n" +"%s" + +#: ../lib/CA.pm:665 ../lib/CERT.pm:61 +#, c-format +msgid "Can't open Certificate directory: %s" +msgstr "Impossible d'ouvrir le rpertoire de certificat: %s" + +#: ../lib/CA.pm:684 ../lib/CERT.pm:84 +#, c-format +msgid " Read Certificate: %s" +msgstr " Lecture du certificat: %s" + +#: ../lib/CA.pm:694 +#, c-format +msgid "Can't read Certificate file: %s" +msgstr "Impossible de lire le fichier de certificat: %s" + +#: ../lib/CA.pm:718 +#, c-format +msgid "Can't write Certificate file: %s" +msgstr "Impossible d'crire le fichier de certificat: %s" + +#: ../lib/CA.pm:768 ../lib/CA.pm:927 +msgid "Can't open Index file: " +msgstr "Impossible d'ouvrir le fichier d'index: " + +#: ../lib/CA.pm:780 +#, c-format +msgid "Can't write CA Certificate file: %s" +msgstr "Impossible d'crire le fichier de certificat de la CA: %s" + +#: ../lib/CA.pm:800 ../lib/CA.pm:934 +msgid "Can't write Serial file: " +msgstr "Impossible d'crire le numro de srie: " + +#: ../lib/CA.pm:814 +#, c-format +msgid "Can't write CA Key file: %s" +msgstr "Impossible d'crire le fichier de cl prive de la CA: %s" + +#: ../lib/CA.pm:831 ../lib/CA.pm:1155 +msgid "Generating CRL failed" +msgstr "Echec de la generation de la CRL" + +#: ../lib/CA.pm:844 +#, c-format +msgid "Succesfully imported %d certificates\n" +msgstr "Certificats %d imports avec succs\n" + +#: ../lib/CA.pm:845 +msgid "Check the configuration of your imported CA." +msgstr "vrification de la configuration de la CA importe." + +#: ../lib/CA.pm:862 ../lib/CA.pm:971 +msgid "No CA name given" +msgstr "Aucun nom de CA n'a t donn" + +#: ../lib/CA.pm:871 ../lib/CA.pm:876 ../lib/CA.pm:881 ../lib/CA.pm:886 +#: ../lib/CA.pm:891 ../lib/CA.pm:896 +msgid "Can't create directory: " +msgstr "Impossible de crer le rpertoire: " + +#: ../lib/CA.pm:905 +#, c-format +msgid "Can't open template file %s %s" +msgstr "Impossible d'ouvrir le fichier modle %s: %s" + +#: ../lib/CA.pm:910 ../lib/CA.pm:1207 ../lib/CA.pm:1274 ../lib/CERT.pm:637 +#: ../lib/KEY.pm:227 ../lib/REQ.pm:740 +#, c-format +msgid "Can't open output file: %s: %s" +msgstr "Impossible d'ouvrir le fichier de sortie %s: %s" + +#: ../lib/CA.pm:984 ../lib/KEY.pm:482 ../lib/REQ.pm:167 +msgid "Generating key failed" +msgstr "Echec de la gnration de la cl" + +#: ../lib/CA.pm:1018 ../lib/REQ.pm:193 +msgid "Generating Request failed" +msgstr "Echec de la gnration de la requte de certification" + +#: ../lib/CA.pm:1027 ../lib/CA.pm:1041 ../lib/CERT.pm:102 +msgid "Can't read Certificate" +msgstr "Impossible de lire le certificat" + +#: ../lib/CA.pm:1032 ../lib/CA.pm:1046 +msgid "Can't write Certificate" +msgstr "Impossible d'crire le certificat" + +#: ../lib/CA.pm:1086 +msgid "Generating certificate failed" +msgstr "Echec de la gnration du certificat" + +#: ../lib/CA.pm:1106 ../lib/CA.pm:1131 +#, c-format +msgid "Can't open ca certificate file %s %s" +msgstr "Impossible d'ouvrir le fichier certificat de la CA %s %s" + +#: ../lib/CA.pm:1115 +#, c-format +msgid "Can't create certificate chain file: %s: %s" +msgstr "" +"Impossible de crer le fichier contenant la chane de certification: %s: %s" + +#: ../lib/CA.pm:1164 +#, c-format +msgid "CA: %s created" +msgstr "CA: %s cre" + +#: ../lib/CA.pm:1199 +#, c-format +msgid "Can't open certificate chain file: %s: %s" +msgstr "" +"Impossible d'ouvrir le fichier contenant la chane de certification: %s: %s" + +#: ../lib/CA.pm:1220 +#, c-format +msgid "Certificate Chain succesfully exported to: %s" +msgstr "Chane de certification exporte avec succs dans: %s " + +#: ../lib/CA.pm:1255 ../lib/CERT.pm:580 ../lib/GUI.pm:166 ../lib/KEY.pm:348 +#: ../lib/REQ.pm:71 ../lib/REQ.pm:389 +msgid "Can't read CA certificate" +msgstr "Impossible de lire le certificat de la CA" + +#: ../lib/CA.pm:1265 +#, c-format +msgid "Invalid Format for export_ca_cert(): %s" +msgstr "Format invalide pour la fonction export_ca_cert(): %s" + +#: ../lib/CA.pm:1287 +#, c-format +msgid "Certificate succesfully exported to: %s" +msgstr "Certificat export avec succs dans: %s" + +#: ../lib/CA.pm:1320 +msgid "Please give the output file" +msgstr "Veuillez renseigner le nom du fichier de sortie" + +#: ../lib/CA.pm:1328 +msgid "Please give the CA password to create the Revocation List" +msgstr "" +"Veuillez donner le mot de passe de la CA pour crer la Liste de Rvocation" + +#: ../lib/CA.pm:1349 +msgid "" +"Wrong CA password given\n" +"Generating Revocation List failed" +msgstr "" +"Erreur dans le mot de passe de la CA\n" +"Echec de la gnration de la Liste de Rvocation" + +#: ../lib/CA.pm:1353 +msgid "" +"CA Key not found\n" +"Generating Revocation List failed" +msgstr "" +"Impossible de trouver la cl prive de la CA\n" +"Echec de la gnration de la Liste de Rvocation" + +#: ../lib/CA.pm:1357 ../lib/CA.pm:1363 +msgid "Generating Revocation List failed" +msgstr "Echec de la gnration de la Liste de Rvocation" + +#: ../lib/CA.pm:1371 +#, c-format +msgid "CRL successfully exported to: %s" +msgstr "CRL exporte avec succs dans : %s" + +#: ../lib/CERT.pm:143 ../lib/CERT.pm:199 ../lib/CERT.pm:322 ../lib/CERT.pm:381 +#: ../lib/GUI.pm:851 +msgid "Please select a Certificate first" +msgstr "Veuillez d'abord slectionner un certificat" + +#: ../lib/CERT.pm:151 ../lib/CERT.pm:209 ../lib/CERT.pm:333 ../lib/CERT.pm:400 +#: ../lib/GUI.pm:2706 ../lib/GUI.pm:2717 ../lib/OpenSSL.pm:702 +#: ../lib/GUI/X509_browser.pm:276 +msgid "VALID" +msgstr "VALIDE" + +#: ../lib/CERT.pm:153 +#, c-format +msgid "" +"Can't renew Certifikate with Status: %s\n" +"Please revoke the Certificate first" +msgstr "" +"Impossible de renouveler le certificat dont le status est: %s\n" +"Veuillez d'abord rvoquer le certificat" + +#: ../lib/CERT.pm:168 +msgid "" +"Key and Request are necessary for renewal of a Certificate\n" +"Renewal is not possible!" +msgstr "" +"La cl prive et la requte de certification sont ncessaires pour le " +"renouvellement du certificat\n" +"Renouvellement de certificat impossible!" + +#: ../lib/CERT.pm:210 +#, c-format +msgid "Can't revoke Certifikate with Status: %s" +msgstr "Impossible de rvoquer le certificat dont le status est: %s" + +#: ../lib/CERT.pm:256 +msgid "" +"Wrong CA password given\n" +"Revoking the Certificate failed" +msgstr "" +"Erreur dans le mot de passe de la CA\n" +"Echec de la rvocation du certificat" + +#: ../lib/CERT.pm:263 +msgid "" +"CA Key not found\n" +"Revoking the Certificate failed" +msgstr "" +"Impossible de trouver la cl prive de la CA\n" +"Echec de la rvocation du certificat" + +#: ../lib/CERT.pm:270 +msgid "Revoking the Certificate failed" +msgstr "Echec de la rvocation du certificat" + +#: ../lib/CERT.pm:290 +msgid "Generating a new Revocation List failed" +msgstr "Echec de la gnration de la nouvelle Liste de Rvocation" + +#: ../lib/CERT.pm:335 +msgid "" +"Can't delete VALID certificate!\n" +"Please revoke the Certificate first." +msgstr "" +"Impossible de supprimer un certificat VALIDE!\n" +"Veuillez d'abord rvoquer le certificat." + +#: ../lib/CERT.pm:401 +msgid "Certificate seems not to be VALID" +msgstr "Le certificat ne semble pas VALIDE" + +#: ../lib/CERT.pm:403 +msgid "Export is not possible" +msgstr "Export impossible" + +#: ../lib/CERT.pm:430 ../lib/KEY.pm:172 +msgid "Please give at least the output file" +msgstr "Veuillez rensigner au minimum le fichier de sortie" + +#: ../lib/CERT.pm:436 +msgid "Key is necessary for export as PKCS#12" +msgstr "La cl prive est ncessaire pour exporter au format PKCS#12" + +#: ../lib/CERT.pm:438 ../lib/CERT.pm:454 ../lib/KEY.pm:257 ../lib/KEY.pm:308 +msgid "Export is not possible!" +msgstr "Export impossible!" + +#: ../lib/CERT.pm:452 +#, c-format +msgid "Key is necessary for export as %s" +msgstr "La cl prive est ncessaire pour exporter au format %s" + +#: ../lib/CERT.pm:492 ../lib/KEY.pm:216 +#, c-format +msgid "Can't open Certificate file: %s: %s" +msgstr "Impossible d'ouvrir le fichier de certificat: %s: %s" + +#: ../lib/CERT.pm:525 ../lib/KEY.pm:288 +msgid "Generating PKCS#12 failed" +msgstr "Echec de la gnration du fichier PKCS#12" + +#: ../lib/CERT.pm:533 ../lib/CERT.pm:616 ../lib/KEY.pm:295 ../lib/KEY.pm:381 +#, c-format +msgid "Certificate and Key successfully exported to %s" +msgstr "Le certificat et la cl prive ont t correctement exports dans %s" + +#: ../lib/CERT.pm:546 ../lib/CERT.pm:567 ../lib/REQ.pm:693 +#, c-format +msgid "Can't create temporary file: %s: %s" +msgstr "Impossible de crer le fichier temporaire: %s: %s" + +#: ../lib/CERT.pm:558 +#, c-format +msgid "Can't read Key file: %s: %s" +msgstr "Impossible d'ouvrir le fichier de cl prive: %s: %s" + +#: ../lib/CERT.pm:588 ../lib/KEY.pm:321 ../lib/KEY.pm:337 ../lib/KEY.pm:355 +msgid "Can't create temporary file" +msgstr "Cration du fichier temporaire impossible" + +#: ../lib/CERT.pm:609 ../lib/KEY.pm:375 +#, c-format +msgid "Generating %s file failed" +msgstr "Echec de la gnration du fichier %s" + +#: ../lib/CERT.pm:628 +#, c-format +msgid "Invalid Format for export_cert(): %s" +msgstr "Format invalide pour la fonction export_cert(): %s" + +#: ../lib/CERT.pm:648 +#, c-format +msgid "Certificate successfully exported to: %s" +msgstr "Certificat export avec succs dans: %s" + +#: ../lib/GUI.pm:171 ../lib/GUI.pm:178 +msgid "CA" +msgstr "CA" + +#: ../lib/GUI.pm:185 +msgid "CA Information" +msgstr "Informations CA" + +#: ../lib/GUI.pm:204 +msgid "Certificates" +msgstr "Certificats" + +#: ../lib/GUI.pm:244 ../lib/GUI.pm:2689 ../lib/GUI/WORDS.pm:56 +#: ../lib/GUI/X509_browser.pm:160 ../lib/GUI/X509_browser.pm:168 +#: ../lib/GUI/X509_browser.pm:177 +msgid "Common Name" +msgstr "Nom Commun (Common Name)" + +#: ../lib/GUI.pm:245 ../lib/GUI.pm:1273 ../lib/GUI.pm:2314 +#: ../lib/GUI/WORDS.pm:57 ../lib/GUI/X509_browser.pm:161 +#: ../lib/GUI/X509_browser.pm:169 ../lib/GUI/X509_browser.pm:178 +msgid "eMail Address" +msgstr "Adresse eMail" + +#: ../lib/GUI.pm:246 ../lib/GUI/WORDS.pm:59 ../lib/GUI/X509_browser.pm:162 +#: ../lib/GUI/X509_browser.pm:170 ../lib/GUI/X509_browser.pm:179 +msgid "Organizational Unit" +msgstr "Unit Organisationnelle (OU)" + +#: ../lib/GUI.pm:247 ../lib/GUI/WORDS.pm:58 ../lib/GUI/X509_browser.pm:163 +#: ../lib/GUI/X509_browser.pm:171 ../lib/GUI/X509_browser.pm:180 +msgid "Organization" +msgstr "Organisation" + +#: ../lib/GUI.pm:248 ../lib/GUI/WORDS.pm:60 ../lib/GUI/X509_browser.pm:164 +#: ../lib/GUI/X509_browser.pm:172 ../lib/GUI/X509_browser.pm:181 +msgid "Location" +msgstr "Localisation" + +#: ../lib/GUI.pm:249 ../lib/GUI/WORDS.pm:61 ../lib/GUI/X509_browser.pm:165 +#: ../lib/GUI/X509_browser.pm:173 ../lib/GUI/X509_browser.pm:182 +msgid "State" +msgstr "Province" + +#: ../lib/GUI.pm:250 ../lib/GUI/WORDS.pm:62 ../lib/GUI/X509_browser.pm:166 +#: ../lib/GUI/X509_browser.pm:174 ../lib/GUI/X509_browser.pm:183 +msgid "Country" +msgstr "Pays" + +#: ../lib/GUI.pm:251 ../lib/GUI/WORDS.pm:68 ../lib/GUI/X509_browser.pm:184 +msgid "Type" +msgstr "Type" + +#: ../lib/GUI.pm:265 +msgid "Keys" +msgstr "Cls" + +#: ../lib/GUI.pm:308 +msgid "Requests" +msgstr "Requtes de certification" + +#: ../lib/GUI.pm:399 +#, c-format +msgid " Actual CA: %s" +msgstr " CA actuelle: %s" + +#: ../lib/GUI.pm:402 +#, c-format +msgid " Actual CA: %s - Certificates" +msgstr " CA actuelle: %s - Certificats" + +#: ../lib/GUI.pm:405 +#, c-format +msgid " Actual CA: %s - Keys" +msgstr " CA actuelle : %s - Cls" + +#: ../lib/GUI.pm:408 +#, c-format +msgid " Actual CA: %s - Requests" +msgstr " CA actuelles: %s - Requtes de certification" + +#: ../lib/GUI.pm:457 ../lib/GUI.pm:1141 +msgid "Open CA" +msgstr "Ouvrir la CA" + +#: ../lib/GUI.pm:463 +msgid "New CA" +msgstr "Nouvelle CA" + +#: ../lib/GUI.pm:469 ../lib/GUI.pm:2382 +msgid "Import CA" +msgstr "Importer la CA" + +#: ../lib/GUI.pm:475 ../lib/GUI.pm:1143 +msgid "Delete CA" +msgstr "Supprimer la CA" + +#: ../lib/GUI.pm:485 ../lib/GUI.pm:524 ../lib/GUI.pm:592 +msgid "Details" +msgstr "Details" + +#: ../lib/GUI.pm:491 +msgid "History" +msgstr "Historique" + +#: ../lib/GUI.pm:497 +msgid "Sub CA" +msgstr "CA intermdiaire" + +#: ../lib/GUI.pm:503 +msgid "Export CA" +msgstr "Exporter la CA" + +#: ../lib/GUI.pm:509 ../lib/GUI.pm:1419 +msgid "Export CRL" +msgstr "Exporter la CRL" + +#: ../lib/GUI.pm:516 +msgid "Export Chain" +msgstr "Exporter la Chane" + +#: ../lib/GUI.pm:530 ../lib/GUI.pm:598 +msgid "View" +msgstr "Afficher" + +#: ../lib/GUI.pm:540 ../lib/GUI.pm:604 +msgid "New" +msgstr "Nouveau" + +#: ../lib/GUI.pm:547 ../lib/GUI.pm:578 +msgid "Export" +msgstr "Exporter" + +#: ../lib/GUI.pm:553 +msgid "Revoke" +msgstr "Revoquer" + +#: ../lib/GUI.pm:563 +msgid "Renew" +msgstr "Renouveler" + +#: ../lib/GUI.pm:570 ../lib/GUI.pm:584 ../lib/GUI.pm:627 +msgid "Delete" +msgstr "Supprimer" + +#: ../lib/GUI.pm:610 +msgid "Import" +msgstr "Importer" + +#: ../lib/GUI.pm:620 +msgid "Sign" +msgstr "Signer" + +#: ../lib/GUI.pm:646 +msgid "_CA" +msgstr "_CA" + +#: ../lib/GUI.pm:649 +msgid "_Open CA" +msgstr "_Ouvrir CA" + +#: ../lib/GUI.pm:654 +msgid "_New CA" +msgstr "_Nouvelle CA" + +#: ../lib/GUI.pm:659 +msgid "_Delete CA" +msgstr "_Supprimer CA" + +#: ../lib/GUI.pm:667 +msgid "_Exit" +msgstr "_Quitter" + +#: ../lib/GUI.pm:674 +msgid "_Preferences" +msgstr "_Preferences" + +#: ../lib/GUI.pm:677 +msgid "Experts Only!!" +msgstr "Reserv aux experts!!" + +#: ../lib/GUI.pm:682 +msgid "OpenSSL _Configuration" +msgstr "_Configuration OpenSSL" + +#: ../lib/GUI.pm:689 ../lib/GUI.pm:692 +msgid "_Help" +msgstr "_Aide" + +#: ../lib/GUI.pm:697 +msgid "_About TinyCA" +msgstr "_A propos de TinyCA" + +#: ../lib/GUI.pm:728 +msgid "Invalid mode for show_text():" +msgstr "Mode invalide pour la fonction show_text():" + +#: ../lib/GUI.pm:733 ../lib/GUI.pm:848 ../lib/REQ.pm:236 ../lib/REQ.pm:367 +msgid "Please select a Request first" +msgstr "Veuillez d'abord slectionner une requte de certification" + +#: ../lib/GUI.pm:736 +msgid "Please select a certificate first" +msgstr "Veuillez d'abord slectionner un certificat" + +#: ../lib/GUI.pm:752 ../lib/GUI.pm:867 ../lib/GUI/X509_browser.pm:456 +#: ../lib/GUI/X509_browser.pm:515 +msgid "Can't read file" +msgstr "Impossible de lire le fichier" + +#: ../lib/GUI.pm:754 +msgid "Request" +msgstr "Requte de certification" + +#: ../lib/GUI.pm:754 +msgid "Certificate" +msgstr "Certificat" + +#: ../lib/GUI.pm:815 +#, c-format +msgid "Invalid mode for _show_popup_menu(): %s" +msgstr "Mode erron pour la fonction show_popup_menu(): %s" + +#: ../lib/GUI.pm:843 +msgid "Invalid mode for show_details():" +msgstr "Mode erron pour la fonction show_details()" + +#: ../lib/GUI.pm:869 ../lib/GUI.pm:969 ../lib/GUI.pm:3040 +msgid "Request Details" +msgstr "Dtails de la requte de certification" + +#: ../lib/GUI.pm:869 ../lib/GUI.pm:969 ../lib/GUI.pm:2897 +msgid "Certificate Details" +msgstr "Dtails du certificat" + +#: ../lib/GUI.pm:911 ../lib/GUI.pm:1679 ../lib/GUI.pm:3061 +msgid "Import Request" +msgstr "Importer la requte de certification" + +#: ../lib/GUI.pm:913 ../lib/GUI.pm:2438 +msgid "Import CA Certificate" +msgstr "Importer le Certificat de la CA" + +#: ../lib/GUI.pm:921 +msgid "Do you want to import the following Certificate Request?" +msgstr "Voulez-vous importer la requte de certification suivante ?" + +#: ../lib/GUI.pm:923 +msgid "Do you want to import the following CA Certificate?" +msgstr "Voulez-vous importer le certificat de CA suivant ?" + +#: ../lib/GUI.pm:977 +msgid "Subject DN" +msgstr "Sujet DN" + +#: ../lib/GUI.pm:1001 +msgid "Issuer" +msgstr "Emetteur" + +#: ../lib/GUI.pm:1027 +msgid "Validity" +msgstr "Validit" + +#: ../lib/GUI.pm:1043 +msgid "Key/Request Details:" +msgstr "Dtails de Cl/Requte:" + +#: ../lib/GUI.pm:1043 +msgid "Key/Certificate Details:" +msgstr "Dtails de Cl/Certificat:" + +#: ../lib/GUI.pm:1059 +msgid "Fingerprints" +msgstr "Empreinte Numrique" + +#: ../lib/GUI.pm:1075 +msgid "Requested X.509 Extensions" +msgstr "Extensions X.509 demandes" + +#: ../lib/GUI.pm:1075 +msgid "X.509v3 Extensions" +msgstr "Extensions X.509v3" + +#: ../lib/GUI.pm:1100 +msgid "Requested Netscape Extensions" +msgstr "Extensions Netscape demandes" + +#: ../lib/GUI.pm:1100 +msgid "Netscape Extensions" +msgstr "Extensions Netscape" + +#: ../lib/GUI.pm:1145 +msgid "Invalid action given: " +msgstr "Action invalide : " + +#: ../lib/GUI.pm:1167 ../lib/GUI.pm:1213 +msgid "Invalid action for show_select_ca_dialog(): " +msgstr "Action invalide pour la fonction show_select_ca_dialog(): " + +#: ../lib/GUI.pm:1189 +msgid "Available CAs" +msgstr "CAs disponibles" + +#: ../lib/GUI.pm:1245 +msgid "Create Request" +msgstr "Crer Requte" + +#: ../lib/GUI.pm:1246 +msgid "Create a new Certificate Request" +msgstr "Crer une nouvelle requte de certificat" + +#: ../lib/GUI.pm:1260 +msgid "Common Name (eg, your Name," +msgstr "Nom commun (ie. votre Nom," + +#: ../lib/GUI.pm:1265 +msgid "your eMail Address" +msgstr "votre addresse eMail" + +#: ../lib/GUI.pm:1269 +msgid "or the Servers Name)" +msgstr "ou le Nom du serveur)" + +#: ../lib/GUI.pm:1277 +msgid "Password (protect your private Key):" +msgstr "Mot de passe (protrge votre Cl prive):" + +#: ../lib/GUI.pm:1281 ../lib/GUI.pm:2294 +msgid "Password (confirmation):" +msgstr "Password (confirmation):" + +#: ../lib/GUI.pm:1285 ../lib/GUI.pm:2286 +msgid "Country Name (2 letter code):" +msgstr "Pays (code sur 2 lettres):" + +#: ../lib/GUI.pm:1289 ../lib/GUI.pm:2298 +msgid "State or Province Name:" +msgstr "Etat ou Nom de Province:" + +#: ../lib/GUI.pm:1293 ../lib/GUI.pm:2302 +msgid "Locality Name (eg. city):" +msgstr "Localit (ie. ville):" + +#: ../lib/GUI.pm:1297 ../lib/GUI.pm:2306 +msgid "Organization Name (eg. company):" +msgstr "Nom de l'Organisation (ie. entreprise):" + +#: ../lib/GUI.pm:1303 ../lib/GUI.pm:1308 ../lib/GUI.pm:2310 +msgid "Organizational Unit Name (eg. section):" +msgstr "Unit Organisationelle (ie. dpartement):" + +#: ../lib/GUI.pm:1313 ../lib/GUI.pm:2322 ../lib/GUI/WORDS.pm:65 +msgid "Keylength" +msgstr "Longueur de la cl" + +#: ../lib/GUI.pm:1321 ../lib/GUI.pm:2352 +msgid "Digest" +msgstr "Empreinte" + +#: ../lib/GUI.pm:1328 +msgid "Algorithm" +msgstr "Algorithme" + +#: ../lib/GUI.pm:1359 ../lib/GUI.pm:2918 +msgid "Revoke Certificate" +msgstr "Revoquer le Certificat" + +#: ../lib/GUI.pm:1368 ../lib/GUI.pm:1444 ../lib/GUI.pm:2093 +msgid "CA Password:" +msgstr "Mot de passe de la CA:" + +#: ../lib/GUI.pm:1374 +msgid "Revocation Reason:" +msgstr "Raison de la Revocation:" + +#: ../lib/GUI.pm:1419 +msgid "Export Revocation List to File" +msgstr "Exporter la Liste de Revocation dans un fichier" + +#: ../lib/GUI.pm:1427 ../lib/GUI.pm:1515 ../lib/GUI.pm:1563 ../lib/GUI.pm:1687 +#: ../lib/GUI.pm:1755 +msgid "File:" +msgstr "Fichier:" + +#: ../lib/GUI.pm:1438 ../lib/GUI.pm:1526 ../lib/GUI.pm:1574 ../lib/GUI.pm:1697 +#: ../lib/GUI.pm:1772 ../lib/GUI.pm:2435 ../lib/GUI.pm:2454 ../lib/GUI.pm:2473 +#: ../lib/GUI.pm:2492 +msgid "Browse..." +msgstr "Parcourrir" + +#: ../lib/GUI.pm:1441 ../lib/GUI.pm:1554 ../lib/GUI.pm:1577 +msgid "Export CA Certificate" +msgstr "Exporter le Certificat de la CA" + +#: ../lib/GUI.pm:1448 ../lib/GUI.pm:2099 ../lib/GUI.pm:2318 +msgid "Valid for (Days):" +msgstr "Valide pendant (Jours):" + +#: ../lib/GUI.pm:1452 ../lib/GUI.pm:1581 ../lib/GUI.pm:1779 +msgid "Export Format:" +msgstr "Format d'Export:" + +#: ../lib/GUI.pm:1458 ../lib/GUI.pm:1587 +msgid "PEM" +msgstr "PEM" + +#: ../lib/GUI.pm:1467 ../lib/GUI.pm:1596 +msgid "DER" +msgstr "DER" + +#: ../lib/GUI.pm:1476 ../lib/GUI.pm:1605 +msgid "TXT" +msgstr "TXT" + +#: ../lib/GUI.pm:1507 ../lib/GUI.pm:1529 +msgid "Export CA Certificate Chain" +msgstr "Exporter la Chane de certification de la CA" + +#: ../lib/GUI.pm:1508 +msgid "Export CA Certificate Chain to File" +msgstr "Exporter la Chane de certification de la CA dans un fichier" + +#: ../lib/GUI.pm:1555 +msgid "Export CA Certificate to File" +msgstr "Exporter le Certificat de la CA dans le ficher" + +#: ../lib/GUI.pm:1635 ../lib/GUI.pm:1636 +msgid "Export Key without Passphrase" +msgstr "Exporter la cl sans Passphrase" + +#: ../lib/GUI.pm:1640 +msgid "I hope you know what you're doing?" +msgstr "J'espre que vous savez ce que vous faites!" + +#: ../lib/GUI.pm:1644 +msgid "The Key Passphrase is needed for decryption of the Key" +msgstr "La Passphrase de dchiffrement de la Cl prive est ncessaire" + +#: ../lib/GUI.pm:1653 +msgid "Password:" +msgstr "Mot de passe:" + +#: ../lib/GUI.pm:1679 ../lib/GUI.pm:1700 +msgid "Import Request from File" +msgstr "Importe la requte depuis un fichier" + +#: ../lib/GUI.pm:1721 ../lib/GUI.pm:1759 ../lib/GUI.pm:2911 +msgid "Export Certificate" +msgstr "Export de Certificat" + +#: ../lib/GUI.pm:1723 ../lib/GUI.pm:1761 ../lib/GUI.pm:2868 +msgid "Export Key" +msgstr "Export de la Cl" + +#: ../lib/GUI.pm:1726 +msgid "Invalid mode for show_export_dialog(): " +msgstr "Mode erron pour la fonction show_export_dialog():" + +#: ../lib/GUI.pm:1743 +msgid "Export Certificate to File" +msgstr "Export de Certificat dans un Fichier" + +#: ../lib/GUI.pm:1745 +msgid "Export Key to File" +msgstr "Export de Cl dans un Fichier" + +#: ../lib/GUI.pm:1783 +msgid "PEM (Certificate)" +msgstr "PEM (Certificat)" + +#: ../lib/GUI.pm:1785 +msgid "PEM (Key)" +msgstr "PEM (Cl)" + +#: ../lib/GUI.pm:1794 +msgid "DER (Certificate)" +msgstr "DER (Certificat)" + +#: ../lib/GUI.pm:1796 +msgid "DER (Key without Passphrase)" +msgstr "DER (Cl sans Mot de passe)" + +#: ../lib/GUI.pm:1804 +msgid "PKCS#12 (Certificate & Key)" +msgstr "PKCS#12 (Certificat & Cl)" + +#: ../lib/GUI.pm:1811 +msgid "Zip (Certificate & Key)" +msgstr "Zip (Certificat & Cl)" + +#: ../lib/GUI.pm:1821 +msgid "Tar (Certificate & Key)" +msgstr "Tar (Certificat & Cl)" + +#: ../lib/GUI.pm:1833 +msgid "TXT (Certificate)" +msgstr "TXT (Certificat)" + +#: ../lib/GUI.pm:1839 +msgid "Without Passphrase (PEM/PKCS#12)" +msgstr "Sans Mot de passe (PEM/PKCS#12)" + +#: ../lib/GUI.pm:1845 ../lib/GUI.pm:1872 ../lib/GUI.pm:1891 ../lib/GUI.pm:2018 +#: ../lib/GUI.pm:2043 ../lib/GUI.pm:2196 +msgid "Yes" +msgstr "Oui" + +#: ../lib/GUI.pm:1850 ../lib/GUI.pm:1877 ../lib/GUI.pm:1896 ../lib/GUI.pm:2024 +#: ../lib/GUI.pm:2049 ../lib/GUI.pm:2202 +msgid "No" +msgstr "Non" + +#: ../lib/GUI.pm:1860 +msgid "Include Key (PEM)" +msgstr "Inclure la Cl (PEM)" + +#: ../lib/GUI.pm:1865 +msgid "Include Certificate (PEM)" +msgstr "Inclure le Certificat (PEM)" + +#: ../lib/GUI.pm:1885 +msgid "Include Fingerprint (PEM)" +msgstr "Inclure l'empreinte digitale (PEM)" + +#: ../lib/GUI.pm:1993 ../lib/GUI.pm:1994 +msgid "Export to PKCS#12" +msgstr "Exporter au format PKCS#12" + +#: ../lib/GUI.pm:2001 +msgid "Key Password:" +msgstr "Mot de passe de la Cl:" + +#: ../lib/GUI.pm:2005 +msgid "Export Password:" +msgstr "Mot de passe d'Export:" + +#: ../lib/GUI.pm:2008 +msgid "Friendly Name:" +msgstr "" + +#: ../lib/GUI.pm:2012 +msgid "Without Passphrase" +msgstr "Sans Mot de passe" + +#: ../lib/GUI.pm:2037 +msgid "Add CA Certificate to PKCS#12 structure" +msgstr "Ajouter le Certificat de la Ca la structure PKCS#12" + +#: ../lib/GUI.pm:2085 ../lib/GUI.pm:3068 +msgid "Sign Request" +msgstr "Signer la Requte" + +#: ../lib/GUI.pm:2085 +msgid "Sign Request/Create Certificate" +msgstr "Signer la Requte/Crer le Certificat" + +#: ../lib/GUI.pm:2110 ../lib/GUI.pm:2155 +msgid "Subject alternative name (IP Address):" +msgstr "Nom Complmentaire (Subject alternative name) - Adresse IP:" + +#: ../lib/GUI.pm:2113 ../lib/GUI.pm:2158 +msgid "Subject alternative name (DNS Name):" +msgstr "Nom Complmentaire (Subject alternative name) - Nom DNS:" + +#: ../lib/GUI.pm:2116 ../lib/GUI.pm:2164 +msgid "Subject alternative name (raw):" +msgstr "Nom Complmentaire (Subject alternative name) - (raw):" + +#: ../lib/GUI.pm:2124 ../lib/GUI.pm:2172 +msgid "Extended Key Usage:" +msgstr "Usage Etendu de la Cl (Extended Key Usage):" + +#: ../lib/GUI.pm:2131 +msgid "Netscape SSL Server Name:" +msgstr "Nom de serveur Netscape SSL:" + +#: ../lib/GUI.pm:2138 ../lib/GUI.pm:2179 +msgid "Netscape Revocation URL:" +msgstr "URL de Rvocation Netscape:" + +#: ../lib/GUI.pm:2145 ../lib/GUI.pm:2186 +msgid "Netscape Renewal URL:" +msgstr "URL de Renouvellement Netscape:" + +#: ../lib/GUI.pm:2161 +msgid "Subject alternative name (eMail Address):" +msgstr "Nom Complmentaire (Subject alternative name) - Adresse email:" + +#: ../lib/GUI.pm:2208 +msgid "Add eMail Address to Subject DN:" +msgstr "Ajouter l'adresse eMail au DN du Sujet:" + +#: ../lib/GUI.pm:2238 ../lib/GUI.pm:2242 +msgid "Create CA" +msgstr "Creer une CA" + +#: ../lib/GUI.pm:2238 +msgid "Create a new Sub CA" +msgstr "Creer une nouvelle CA intermdiaire" + +#: ../lib/GUI.pm:2242 +msgid "Create a new CA" +msgstr "Creer une nouvelle CA" + +#: ../lib/GUI.pm:2255 +msgid "CA Password (for creating the new CA):" +msgstr "Mot de passe de la CA (pour la cration de la nouvelle CA):" + +#: ../lib/GUI.pm:2266 ../lib/GUI.pm:2403 +msgid "Name (for local storage):" +msgstr "Nom (pour stockage local):" + +#: ../lib/GUI.pm:2273 +msgid "Data for CA Certificate" +msgstr "Informations pour le Certificat de la CA" + +#: ../lib/GUI.pm:2282 +msgid "Common Name (for the CA):" +msgstr "CN (Common Name) pour la CA:" + +#: ../lib/GUI.pm:2290 +msgid "Password (needed for signing):" +msgstr "Mot de passe (requis pour la signature):" + +#: ../lib/GUI.pm:2382 +msgid "Import an existing CA into TinyCA" +msgstr "Importer une CA exitante" + +#: ../lib/GUI.pm:2393 +msgid "Password of the private CA key (Needed for import):" +msgstr "Mot de passe de la Cl prive (Requis pour l'importation):" + +#: ../lib/GUI.pm:2407 +msgid "New password for the CA:" +msgstr "Nouveau Mot de passe pour la CA:" + +#: ../lib/GUI.pm:2411 +msgid "Confirm password:" +msgstr "Confirmer le Mot de passe:" + +#: ../lib/GUI.pm:2416 +msgid "Files/Directories to import" +msgstr "Fichiers/Rpertoires importer" + +#: ../lib/GUI.pm:2424 +msgid "CA Certificate (PEM/DER):" +msgstr "Certificat de la CA (PEM/DER):" + +#: ../lib/GUI.pm:2443 +msgid "CA private key (PEM/DER):" +msgstr "Cl prive de la CA (PEM/DER):" + +#: ../lib/GUI.pm:2457 +msgid "Import CA private Key" +msgstr "Importer la Cl prive de la CA" + +#: ../lib/GUI.pm:2462 +msgid "OpenSSL Index File (index.txt):" +msgstr "Fichier d'Index d'OpenSSL (index.txt):" + +#: ../lib/GUI.pm:2476 +msgid "Import Index File" +msgstr "Importer le fichier d'index" + +#: ../lib/GUI.pm:2481 +msgid "Directory containing certificates (PEM/DER):" +msgstr "Rpertoire contenant les Certificats (PEM/DER):" + +#: ../lib/GUI.pm:2495 +msgid "Import Certificates from directory" +msgstr "Importer les Certificats du rpertoire" + +#: ../lib/GUI.pm:2509 +msgid "You are kidding, are you??" +msgstr "Vous voulez rire, n'est-ce pas ?" + +#: ../lib/GUI.pm:2531 +msgid "Spanish: Ramon Pons Vivanco " +msgstr "Espagnol: Ramon Pons Vivanco " + +#: ../lib/GUI.pm:2532 +msgid "Czech: Robert Wolf " +msgstr "Tcheck: Robert Wolf " + +#: ../lib/GUI.pm:2533 +msgid "French: Thibault Le Meur " +msgstr "French: Thibault Le Meur " + +#: ../lib/GUI.pm:2549 +msgid "Do you really want to delete the selected Request?" +msgstr "Voulez-vous vraiment dtruire la Requte slectionne?" + +#: ../lib/GUI.pm:2551 +msgid "Do you really want to delete the selected Key?" +msgstr "Voulez-vous vraiment dtruire la Cl slectionne?" + +#: ../lib/GUI.pm:2553 +msgid "Do you really want to delete the selected Certificate?" +msgstr "Voulez-vous vraiment dtruire le Certificat slectionn?" + +#: ../lib/GUI.pm:2603 +msgid "Overwrite Request/Key" +msgstr "Ecraser la Requte/Cl" + +#: ../lib/GUI.pm:2609 +msgid "The Key or the Request is already existing!" +msgstr "La Cl ou la Requte existe dj!" + +#: ../lib/GUI.pm:2614 +msgid "You won't be able to sign this Request" +msgstr "Vous ne pourrez pas signer cette Requte" + +#: ../lib/GUI.pm:2619 +msgid "if the corresponding certificate is still valid" +msgstr "Si le Certificat correspondant est tjours valide" + +#: ../lib/GUI.pm:2636 +msgid "The Certificate will be longer valid than your CA!" +msgstr "" +"La date de validit du Certificat dpasse la date de validit de la CA!" + +#: ../lib/GUI.pm:2638 +msgid "This may cause problems with some software!!" +msgstr "Cela peut causer des problmes avec certains logiciels!!" + +#: ../lib/GUI.pm:2653 +msgid "Expirationdate Warning" +msgstr "Avertissement de date d'Expiration" + +#: ../lib/GUI.pm:2688 ../lib/GUI/WORDS.pm:69 +msgid "Serial" +msgstr "Numro de Srie" + +#: ../lib/GUI.pm:2690 ../lib/GUI/WORDS.pm:70 ../lib/GUI/X509_browser.pm:175 +msgid "Status" +msgstr "Etat" + +#: ../lib/GUI.pm:2691 ../lib/GUI/WORDS.pm:64 +msgid "Expiration Date" +msgstr "Date d'Expiration" + +#: ../lib/GUI.pm:2692 +msgid "Revocation Date" +msgstr "Date de Rvocation" + +#: ../lib/GUI.pm:2693 +msgid "Revocation Reason" +msgstr "Cause de la Rvocation" + +#: ../lib/GUI.pm:2719 ../lib/OpenSSL.pm:705 +msgid "EXPIRED" +msgstr "EXPIRE" + +#: ../lib/GUI.pm:2721 ../lib/OpenSSL.pm:718 +msgid "REVOKED" +msgstr "REVOQUE" + +#: ../lib/GUI.pm:2741 +msgid "CA History" +msgstr "Historique de la CA" + +#: ../lib/GUI.pm:2775 +msgid "Overwrite Certificate" +msgstr "Ecraser le Certificat" + +#: ../lib/GUI.pm:2781 +msgid "There seems to be a certificate with the same Subject already." +msgstr "Il semble qu'un Certificat avec le mme Sujet existe dj." + +#: ../lib/GUI.pm:2786 +msgid "" +"Creating a new one (overwrite) will fail if it's not revoked or expired!" +msgstr "" +"La cration d'un nouveau Certificat (Ecrasement) chouera s'il l'ancien " +"n'est pas rvoqu ou n'a pas expir!" + +#: ../lib/GUI.pm:2792 +msgid "Really try to overwrite the Certificate?" +msgstr "Voulez-vous vraiment essayer d'craser le Certificat?" + +#: ../lib/GUI.pm:2825 +msgid "Convert CA" +msgstr "Convertir la CA" + +#: ../lib/GUI.pm:2833 +msgid "" +"This CA seems to be created with openssl 0.9.6x. And it seems like you have " +"switched to openssl 0.9.7x." +msgstr "" +"Il semble que ce CA a t cr avec OpenSSL 0.9.6x. Et il semble que vous " +"avez mis jour OpenSSL en version 0.9.7x." + +#: ../lib/GUI.pm:2841 +msgid "" +"You won't be able to revoke the existing certificates without converting the " +"index file of this CA to the new format." +msgstr "" +"Vous ne pourrez pas rvoquer les certificats existant sans convertir le " +"fichier d'index de cette CA dans le nouveau format." + +#: ../lib/GUI.pm:2849 +msgid "" +"Attention: it will not be easy to switch back, this has to be done manually" +msgstr "" +"Attention: il ne sera pas facil de revenir en arrire, cela doit tre fait " +"manuellement" + +#: ../lib/GUI.pm:2875 +msgid "Delete Key" +msgstr "Supprimer la Cl" + +#: ../lib/GUI.pm:2904 +msgid "View Certificate" +msgstr "Afficher le Certificat" + +#: ../lib/GUI.pm:2925 +msgid "Renew Certificate" +msgstr "Renouveler le Certificat" + +#: ../lib/GUI.pm:2933 +msgid "Delete Certificate" +msgstr "Supprimer le Certificat" + +#: ../lib/GUI.pm:2956 +msgid "Create Key and Certificate (Server)" +msgstr "Crer une Cl et un Certificat (Serveur)" + +#: ../lib/GUI.pm:2962 +msgid "Create Key and Certificate (Client)" +msgstr "Crer une Cl et un Certificat (Client)" + +#: ../lib/GUI.pm:2983 +msgid "Renew Certificate (Server)" +msgstr "Renouveler le Certificat (Serveur)" + +#: ../lib/GUI.pm:2990 +msgid "Renew Certificate (Client)" +msgstr "Renouveler le Certificat (Client)" + +#: ../lib/GUI.pm:3012 +msgid "Sign Request (Server)" +msgstr "Signer la Requte (Serveur)" + +#: ../lib/GUI.pm:3019 +msgid "Sign Request (Client)" +msgstr "Signer la Requte (Client)" + +#: ../lib/GUI.pm:3047 +msgid "View Request" +msgstr "Afficher la Requte" + +#: ../lib/GUI.pm:3054 +msgid "New Request" +msgstr "Nouvelle Requte" + +#: ../lib/GUI.pm:3076 +msgid "Delete Request" +msgstr "Supprimer la Requte" + +#: ../lib/HELPERS.pm:207 +#, c-format +msgid "Can't write exportdir: %s, %s" +msgstr "Impossible d'crire dans le rperoire d'export: %s: %s" + +#: ../lib/KEY.pm:45 ../lib/KEY.pm:137 +msgid "Please select a Key first" +msgstr "Veuillez d'abord slectionner une Cl" + +#: ../lib/KEY.pm:54 +msgid "Key file not found:" +msgstr "Fichier contenant la Cl introuvable:" + +#: ../lib/KEY.pm:101 +msgid "Can't open key directory" +msgstr "Impossible d'ouvrir le rpertoire des Cls" + +#: ../lib/KEY.pm:194 +msgid "" +"Wrong password given\n" +"Decrypting of the Key failed\n" +"Export is not possible" +msgstr "" +"Mauvais Mot de passe renseign\n" +"Echec de dchiffrement de la Cl\n" +"Export impossible" + +#: ../lib/KEY.pm:199 +msgid "Converting failed, Export not possible" +msgstr "Echec de la conversion, Export impossible" + +#: ../lib/KEY.pm:206 ../lib/KEY.pm:410 +#, c-format +msgid "Can't open Key file: %s: %s" +msgstr "Impossible d'ouvrir le fichier de Cl: %s: %s" + +#: ../lib/KEY.pm:239 +#, c-format +msgid "Key succesfully exported to %s" +msgstr "Cle exporte avec succs: %s" + +#: ../lib/KEY.pm:255 +msgid "Certificate is necessary for export as PKCS#12" +msgstr "Un Certificat est requis pour l'export au format PKCS#12" + +#: ../lib/KEY.pm:305 +#, c-format +msgid "Certificate is necessary for export as %s file" +msgstr "Un Certificat est requis pour l'export au format %s" + +#: ../lib/KEY.pm:330 +msgid "Can't read Key file" +msgstr "Lecture impossible du fichier de Cl" + +#: ../lib/KEY.pm:392 +#, c-format +msgid "Invalid format for export requested: %s" +msgstr "Format invalide pour exporter une Requte: %s" + +#: ../lib/KEY.pm:398 +msgid "Something Failed ??" +msgstr "Une erreur c'est produite??" + +#: ../lib/KEY.pm:448 +#, c-format +msgid "" +"Can't open Key file:\n" +"%s" +msgstr "" +"Lecture impossible du fichier de Cl:\n" +"%s" + +#: ../lib/KEY.pm:485 +msgid "The password for your old CA Key is wrong" +msgstr "Le mot de passe de votre ancienne CA est incorrect" + +#: ../lib/OpenSSL.pm:73 +msgid "Creating DSA key in progress..." +msgstr "Cration de la Cl DSA en cours..." + +#: ../lib/OpenSSL.pm:107 +msgid "Creating RSA key in progress..." +msgstr "Cration de la Cl RSA en cours..." + +#: ../lib/OpenSSL.pm:456 +#, c-format +msgid "Can't open CRL '%s': %s" +msgstr "Impossible d'ouvrir la CRL '%s': %s" + +#: ../lib/OpenSSL.pm:471 ../lib/OpenSSL.pm:484 +msgid "Error converting CRL" +msgstr "Erreur de conversion de la CRL" + +#: ../lib/OpenSSL.pm:582 ../lib/OpenSSL.pm:595 +msgid "Error converting Certificate" +msgstr "Erreur de conversion du Certificat" + +#: ../lib/OpenSSL.pm:655 ../lib/OpenSSL.pm:672 +msgid "Error reading fingerprint from Certificate" +msgstr "Erreur de lecture de l'empreinte digitale du Certificat" + +#: ../lib/OpenSSL.pm:690 +msgid "Error reading subject from Certificate" +msgstr "Erreur de lecture du Sujet du Certificat" + +#: ../lib/OpenSSL.pm:700 +msgid "Can't read CRL" +msgstr "Impossible de lire la CRL" + +#: ../lib/OpenSSL.pm:723 +msgid "UNDEFINED" +msgstr "NON DEFINI" + +#: ../lib/OpenSSL.pm:750 +#, c-format +msgid "Can't open Request file %s: %s" +msgstr "Impossible d'ouvrir le fichier de Requte %s: %s" + +#: ../lib/OpenSSL.pm:767 ../lib/OpenSSL.pm:781 ../lib/REQ.pm:685 +msgid "Error converting Request" +msgstr "Erreur de conversion de la Requte" + +#: ../lib/OpenSSL.pm:863 +#, c-format +msgid "Can't open file %s: %s" +msgstr "Impossible d'ouvrir le fichier %s: %s" + +#: ../lib/OpenSSL.pm:981 ../lib/OpenSSL.pm:1013 +#, c-format +msgid "Can't read index %s: %s" +msgstr "Impossible de lire l'Index %s: %s" + +#: ../lib/OpenSSL.pm:1023 +#, c-format +msgid "Can't write index %s: %s" +msgstr "Impossible d'crire l'Index %s: %s" + +#: ../lib/REQ.pm:58 +#, c-format +msgid "Strange value for 'opts': %s" +msgstr "Valeur trange pour 'opts': %s" + +#: ../lib/REQ.pm:101 +msgid "Please specify at least Common Name " +msgstr "Veuillez au minimum spcifier le CN " + +#: ../lib/REQ.pm:102 +msgid "and Password" +msgstr "et le Mot de passe" + +#: ../lib/REQ.pm:246 ../lib/REQ.pm:376 +msgid "Request file not found" +msgstr "Fichier de Requte introuvable" + +#: ../lib/REQ.pm:299 +msgid "Can't open Request directory" +msgstr "Impossible d'ouvrir le rpertoire de Requtes" + +#: ../lib/REQ.pm:320 +#, c-format +msgid " Read Request: %s" +msgstr " Lecture de la Requte: %s" + +#: ../lib/REQ.pm:414 +msgid "Can't read Request file" +msgstr "Impossible de lire le fichier de Requte" + +#: ../lib/REQ.pm:458 +msgid "Can't read serial" +msgstr "Impossible de lire le Numro de Srie" + +#: ../lib/REQ.pm:531 +msgid "" +"Wrong CA password given\n" +"Signing of the Request failed" +msgstr "" +"Mauvais Mot de passe de CA rensign\n" +"Echec de la signature de la Requte" + +#: ../lib/REQ.pm:537 +msgid "" +"CA Key not found\n" +"Signing of the Request failed" +msgstr "" +"Cl de la CA introuvable\n" +"Echec de la signature de la Requte" + +#: ../lib/REQ.pm:543 +msgid "" +"Certificate already existing\n" +"Signing of the Request failed" +msgstr "" +"Le Certificat existe dj\n" +"Echec de la signature de la Requte" + +#: ../lib/REQ.pm:549 +msgid "" +"Invalid IP Address given\n" +"Signing of the Request failed" +msgstr "" +"Adresse IP fournie invalide\n" +"Echec de la signature de la Requte" + +#: ../lib/REQ.pm:556 ../lib/REQ.pm:574 +msgid "Signing of the Request failed" +msgstr "Echec de la signature de la Requte" + +#: ../lib/REQ.pm:581 +msgid "Can't read Certificate file" +msgstr "Impossible de lire le fichier du Certificat" + +#: ../lib/REQ.pm:587 ../lib/REQ.pm:597 +msgid "Can't write Certificate file" +msgstr "Impossible d'crire le fichier de Certificat" + +#: ../lib/REQ.pm:609 +msgid "" +"Request signed succesfully.\n" +"Certificate created" +msgstr "" +"Requte signe avec succs.\n" +"Certifica cr." + +#: ../lib/REQ.pm:650 +msgid "Please select a Request file first" +msgstr "Veuillez d'abord slectionner une fichier de Requte" + +#: ../lib/REQ.pm:656 +msgid "Can't find Request file: " +msgstr "Impossible de rtouver le fichier de Requte: " + +#: ../lib/REQ.pm:662 +msgid "Can't read Request file:" +msgstr "Impossible de lire le fichier de Requte:" + +#: ../lib/REQ.pm:708 +msgid "Parsing Request failed" +msgstr "Echec de l'analyse du fichier de Requte" + +#: ../lib/TCONFIG.pm:42 +msgid "Please select a CA first" +msgstr "Veuillez d'abord slectionner une CA" + +#: ../lib/TCONFIG.pm:49 +msgid "Can't open configuration" +msgstr "Impossible d'ouvrir le fichier de configuration" + +#: ../lib/TCONFIG.pm:284 ../lib/TCONFIG.pm:299 ../lib/GUI/TCONFIG.pm:47 +#: ../lib/GUI/TCONFIG.pm:1302 +msgid "Can't get CA name" +msgstr "Impossible d'obtenir le nom de la CA" + +#: ../lib/TCONFIG.pm:327 +msgid "Can't open configfile" +msgstr "impossible d'ouvrir le fichier de configuration" + +#: ../lib/GUI/HELPERS.pm:54 ../lib/GUI/HELPERS.pm:94 ../lib/GUI/HELPERS.pm:135 +msgid "Command Details" +msgstr "Dtails " + +#: ../lib/GUI/HELPERS.pm:305 +msgid "Request Files (*.pem, *.der, *.req)" +msgstr "Fichiers de Requtes (*.pem, *.der, *.req)" + +#: ../lib/GUI/HELPERS.pm:312 +msgid "All Files (*.*)" +msgstr "Tout fichier (*.*)" + +#: ../lib/GUI/TCONFIG.pm:74 +msgid "" +"All Settings are written unchanged to openssl.conf.\n" +"So please study the documentation of OpenSSL if you don't know exactly what " +"to do.\n" +"If you are still unsure - keep the defaults and everything is expected to " +"work fine." +msgstr "" +"Toutes les paramtres sont crits tels quels dans openssl.conf.\n" +"Veuillez donc consulter la documentation d'OpenSSL si vous n'te pas sr de " +"ce que vous faites.\n" +"En cas de doute, conservez les paramtres par dfaut et tout devrait bien " +"fonctionner." + +#: ../lib/GUI/TCONFIG.pm:108 ../lib/GUI/TCONFIG.pm:116 +msgid "OpenSSL Configuration" +msgstr "Configuration d'OpenSSL" + +#: ../lib/GUI/TCONFIG.pm:129 +msgid "Only change these options, if you really know, what you are doing!!" +msgstr "Ne changez ces options que si vous savez vraiment ce que vous faites!!" + +#: ../lib/GUI/TCONFIG.pm:137 +msgid "You should be aware, that some options may break some crappy software!!" +msgstr "" +"Attention, certaines de ces options peuvent tre incompatibles avec d'autres " +"logiciels!!" + +#: ../lib/GUI/TCONFIG.pm:146 ../lib/GUI/TCONFIG.pm:1348 +msgid "If you are unsure: leave the defaults untouched" +msgstr "En cas de doute: conservez les paramtres par dfaut" + +#: ../lib/GUI/TCONFIG.pm:182 +msgid "These Settings are passed to OpenSSL for creating Server Certificates" +msgstr "" +"Ces options sont passes OpenSSL pour la cration des Certificats de " +"Serveurs" + +#: ../lib/GUI/TCONFIG.pm:187 ../lib/GUI/TCONFIG.pm:612 +#: ../lib/GUI/TCONFIG.pm:1019 ../lib/GUI/TCONFIG.pm:1239 +#: ../lib/GUI/TCONFIG.pm:1340 +msgid "Multiple Values can be separated by \",\"" +msgstr "Les valeurs multiples peuvent tre spares par des \",\"" + +#: ../lib/GUI/TCONFIG.pm:207 ../lib/GUI/TCONFIG.pm:209 +msgid "Server Certificate Settings" +msgstr "Paramtres pour les Certificats Serveur" + +#: ../lib/GUI/TCONFIG.pm:215 ../lib/GUI/TCONFIG.pm:638 +#: ../lib/GUI/TCONFIG.pm:1047 ../lib/GUI/TCONFIG.pm:1462 +msgid "Subject alternative name (subjectAltName):" +msgstr "Nom complmentaire (subjectAltName):" + +#: ../lib/GUI/TCONFIG.pm:312 ../lib/GUI/TCONFIG.pm:744 +#: ../lib/GUI/TCONFIG.pm:1107 ../lib/GUI/TCONFIG.pm:1358 +msgid "Key Usage (keyUsage):" +msgstr "Utilisation de la Cl (keyUsage):" + +#: ../lib/GUI/TCONFIG.pm:391 ../lib/GUI/TCONFIG.pm:819 +msgid "Extended Key Usage (extendedKeyUsage):" +msgstr "Extension d'Utilisation de la Cl (extendedKeyUsage):" + +#: ../lib/GUI/TCONFIG.pm:467 ../lib/GUI/TCONFIG.pm:894 +#: ../lib/GUI/TCONFIG.pm:1076 ../lib/GUI/TCONFIG.pm:1431 +msgid "Netscape Certificate Type (nsCertType):" +msgstr "Type de Certificat Netscape (nsCertType):" + +#: ../lib/GUI/TCONFIG.pm:496 +msgid "Netscape SSL Server Name (nsSslServerName):" +msgstr "Nom de Serveur SSL Netscape (nsSslServerName):" + +#: ../lib/GUI/TCONFIG.pm:521 ../lib/GUI/TCONFIG.pm:924 +#: ../lib/GUI/TCONFIG.pm:1182 +msgid "Netscape Revocation URL (nsRevocationUrl):" +msgstr "URL de Revocation Netscape (nsRevocationUrl):" + +#: ../lib/GUI/TCONFIG.pm:546 ../lib/GUI/TCONFIG.pm:948 +msgid "Netscape Renewal URL (nsRenewalUrl):" +msgstr "URL de Renouvellement Netscape (nsRenewalUrl):" + +#: ../lib/GUI/TCONFIG.pm:607 +msgid "These Settings are passed to OpenSSL for creating Client Certificates" +msgstr "" +"Ces options sont passes OpenSSL pour la cration des Certificats de " +"Clients" + +#: ../lib/GUI/TCONFIG.pm:632 +msgid "Client Certificate Settings" +msgstr "Paramtres de Certificats Client" + +#: ../lib/GUI/TCONFIG.pm:1014 +msgid "These Settings are passed to OpenSSL for creating CA Certificates" +msgstr "" +"Ces options sont passes OpenSSL pour la cration des Certificats de CA" + +#: ../lib/GUI/TCONFIG.pm:1039 ../lib/GUI/TCONFIG.pm:1041 +msgid "CA Certificate Settings" +msgstr "Paramtres de Certificats de CA" + +#: ../lib/GUI/TCONFIG.pm:1234 +msgid "" +"These Settings are passed to OpenSSL for creating Certificate Revocation " +"Lists" +msgstr "" +"Ces options sont passes OpenSSL pour la cration des Listes de Rvocation " + +#: ../lib/GUI/TCONFIG.pm:1260 +msgid "Revocation List Settings" +msgstr "Paramtres des Listes de Rvocation" + +#: ../lib/GUI/TCONFIG.pm:1322 +msgid "CA Configuration" +msgstr "Configuration de la CA" + +#: ../lib/GUI/TCONFIG.pm:1330 +msgid "These Settings are passed to OpenSSL for creating this CA Certificate" +msgstr "" +"Ces options sont passes OpenSSL pour la cration du Certificat de cette CA" + +#: ../lib/GUI/TCONFIG.pm:1335 +msgid "and the CA Certificates of every SubCA, created with this CA." +msgstr "et les Certificats de toute CA fille crs avec cette CA." + +#: ../lib/GUI/WORDS.pm:26 ../lib/GUI/WORDS.pm:73 +msgid "Not set" +msgstr "Non Dfini" + +#: ../lib/GUI/WORDS.pm:27 ../lib/GUI/WORDS.pm:74 +msgid "Ask User" +msgstr "Demander l'utilisateur" + +#: ../lib/GUI/WORDS.pm:28 ../lib/GUI/WORDS.pm:75 +msgid "critical" +msgstr "critique" + +#: ../lib/GUI/WORDS.pm:29 ../lib/GUI/WORDS.pm:76 +msgid "not critical" +msgstr "non critique" + +#: ../lib/GUI/WORDS.pm:30 ../lib/GUI/WORDS.pm:77 +msgid "Copy Email" +msgstr "Copier l'Email" + +#: ../lib/GUI/WORDS.pm:31 ../lib/GUI/WORDS.pm:78 +msgid "raw" +msgstr "donnes brutes (raw)" + +#: ../lib/GUI/WORDS.pm:32 ../lib/GUI/WORDS.pm:79 +msgid "DNS Name" +msgstr "Nom DNS" + +#: ../lib/GUI/WORDS.pm:33 ../lib/GUI/WORDS.pm:81 +msgid "IP Address" +msgstr "Adresse IP" + +#: ../lib/GUI/WORDS.pm:34 ../lib/GUI/WORDS.pm:80 +msgid "Email" +msgstr "Email" + +#: ../lib/GUI/WORDS.pm:35 ../lib/GUI/WORDS.pm:82 +msgid "SSL Server" +msgstr "Serveur SSL" + +#: ../lib/GUI/WORDS.pm:36 ../lib/GUI/WORDS.pm:83 +msgid "SSL Server, SSL Client" +msgstr "Serveur SSL, Client SSL" + +#: ../lib/GUI/WORDS.pm:37 ../lib/GUI/WORDS.pm:84 +msgid "Key Encipherment" +msgstr "Chiffrement de Cl" + +#: ../lib/GUI/WORDS.pm:38 ../lib/GUI/WORDS.pm:85 +msgid "Digital Signature" +msgstr "Signature Numrique" + +#: ../lib/GUI/WORDS.pm:39 ../lib/GUI/WORDS.pm:86 +msgid "Key Encipherment, Digital Signature" +msgstr "Chiffrement de Cl, Signature Numrique" + +#: ../lib/GUI/WORDS.pm:40 ../lib/GUI/WORDS.pm:87 +msgid "Object Signing" +msgstr "Signature d'Objet" + +#: ../lib/GUI/WORDS.pm:41 ../lib/GUI/WORDS.pm:91 +msgid "SSL Client, Object Signing" +msgstr "Client SSL, Signature d'Objet" + +#: ../lib/GUI/WORDS.pm:42 ../lib/GUI/WORDS.pm:89 +msgid "SSL Client, Email(S/MIME)" +msgstr "Client SSL, Email(S/MIME)" + +#: ../lib/GUI/WORDS.pm:43 ../lib/GUI/WORDS.pm:90 +msgid "SSL Client" +msgstr "Client SSL" + +#: ../lib/GUI/WORDS.pm:44 ../lib/GUI/WORDS.pm:88 +msgid "Email(S/MIME)" +msgstr "Email(S/MIME)" + +#: ../lib/GUI/WORDS.pm:45 ../lib/GUI/WORDS.pm:92 +msgid "SSL Client, Email, Object Signing" +msgstr "Client SSL, Email, Signature d'Objet" + +#: ../lib/GUI/WORDS.pm:46 ../lib/GUI/WORDS.pm:93 +msgid "Object Signing CA" +msgstr "Signature d'Objet CA" + +#: ../lib/GUI/WORDS.pm:47 ../lib/GUI/WORDS.pm:94 +msgid "S/MIME CA" +msgstr "S/MIME CA" + +#: ../lib/GUI/WORDS.pm:48 ../lib/GUI/WORDS.pm:95 +msgid "SSL CA" +msgstr "SSL CA" + +#: ../lib/GUI/WORDS.pm:49 ../lib/GUI/WORDS.pm:96 +msgid "SSL CA, S/MIME CA" +msgstr "SSL CA, S/MIME CA" + +#: ../lib/GUI/WORDS.pm:50 ../lib/GUI/WORDS.pm:97 +msgid "SSL CA, Object Signing CA" +msgstr "SSL CA, Signature d'Objet CA" + +#: ../lib/GUI/WORDS.pm:51 ../lib/GUI/WORDS.pm:98 +msgid "S/MIME CA, Object Signing CA" +msgstr "S/MIME CA, Signature d'Objet CA" + +#: ../lib/GUI/WORDS.pm:52 ../lib/GUI/WORDS.pm:99 +msgid "SSL CA, S/MIME CA, Object Signing CA" +msgstr "SSL CA, S/MIME CA, Signature d'Objet CA" + +#: ../lib/GUI/WORDS.pm:53 ../lib/GUI/WORDS.pm:100 +msgid "Certificate Signing" +msgstr "Signature de Certificat" + +#: ../lib/GUI/WORDS.pm:54 ../lib/GUI/WORDS.pm:101 +msgid "CRL Signing" +msgstr "Signature de CRL" + +#: ../lib/GUI/WORDS.pm:55 ../lib/GUI/WORDS.pm:102 +msgid "Certificate Signing, CRL Signing" +msgstr "Signature de Certificat, Signature de CRL" + +#: ../lib/GUI/WORDS.pm:63 +msgid "Creation Date" +msgstr "Date de Cration" + +#: ../lib/GUI/WORDS.pm:66 +msgid "Public Key Algorithm" +msgstr "Algorithme de Cl Publique" + +#: ../lib/GUI/WORDS.pm:67 +msgid "Signature Algorithm" +msgstr "Algorithme de Signature" + +#: ../lib/GUI/WORDS.pm:71 ../lib/GUI/X509_infobox.pm:80 +msgid "Fingerprint (MD5)" +msgstr "Empreinte Numrique (MD5)" + +#: ../lib/GUI/WORDS.pm:72 ../lib/GUI/X509_infobox.pm:89 +msgid "Fingerprint (SHA1)" +msgstr "Empreinte Numrique (SHA1)" + +#: ../lib/GUI/X509_browser.pm:448 +msgid "Certificate Information" +msgstr "Information du Certificat" + +#: ../lib/GUI/X509_browser.pm:452 +msgid "Request Information" +msgstr "Information de la Requte" + +#: ../lib/GUI/X509_browser.pm:571 +msgid "Invalid browser mode for selection_fname():" +msgstr "Mode de navigation erron pour la fonction selection_fname()" + +#: ../lib/GUI/X509_browser.pm:571 ../lib/GUI/X509_browser.pm:607 +#: ../lib/GUI/X509_browser.pm:656 ../lib/GUI/X509_browser.pm:677 +#: ../lib/GUI/X509_browser.pm:698 ../lib/GUI/X509_browser.pm:725 +msgid " " +msgstr " " + +#: ../lib/GUI/X509_browser.pm:607 +msgid "Invalid browser mode for selection_dn():" +msgstr "Mode de navigation erron pour la fonction selection_dn()" + +#: ../lib/GUI/X509_browser.pm:656 ../lib/GUI/X509_browser.pm:677 +msgid "Invalid browser mode for selection_cn():" +msgstr "Mode de navigation erron pour la fonction selection_cn()" + +#: ../lib/GUI/X509_browser.pm:698 +msgid "Invalid browser mode for selection_status():" +msgstr "Mode de navigation erron pour la fonction selection_status():" + +#: ../lib/GUI/X509_browser.pm:725 +msgid "Invalid browser mode for selection_type():" +msgstr "Mode de navigation erron pour la fonction selection_type()" + +#: ../tinyca2:63 +#, c-format +msgid "Can't execute %s.\n" +msgstr "Impossible d'excuter %s.\n" + +#: ../tinyca2:64 +msgid "Configure correct path to openssl in tinyca.\n" +msgstr "Configurez le chemin correct de la commande openssl dans tinyca.\n" + +#: ../tinyca2:69 +msgid "zip command not found, support disabled.\n" +msgstr "comande zip introuvable, support dsactiv.\n" + +#: ../tinyca2:70 +msgid "Configure correct path to zip in tinyca.\n" +msgstr "Configurez le chemin correct de la commande zip dans tinyca.\n" + +#: ../tinyca2:74 +msgid "tar command not found, support disabled.\n" +msgstr "comande tar introuvable, support dsactiv.\n" + +#: ../tinyca2:75 +msgid "Configure correct path to tar in tinyca.\n" +msgstr "Configurez le chemin correct de la commande tar dans tinyca.\n" + +#: ../tinyca2:82 +msgid "Can't find templatedir.\n" +msgstr "Impossible de trouver le rpertoire de modles.\n" + +#: ../tinyca2:83 +msgid "Please configure correct path with templates in tinyca.\n" +msgstr "" +"Configurez le chemin correct d'accs aux modles (templates) dans tinyca.\n" diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 0000000..feb1801 --- /dev/null +++ b/po/sv.po @@ -0,0 +1,2158 @@ +# Swedish translation of tinyca. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the tinyca package. +# Daniel Nylander , 2006. +# +msgid "" +msgstr "" +"Project-Id-Version: tinyca\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-06-05 18:44+0200\n" +"PO-Revision-Date: 2006-07-10 16:23+0100\n" +"Last-Translator: Daniel Nylander \n" +"Language-Team: Swedish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../lib/CA.pm:45 +msgid "error: can't open basedir: " +msgstr "fel: kan inte öppna baskatalog: " + +#: ../lib/CA.pm:103 +msgid " Opening CA: " +msgstr " Öppnar CA: " + +#: ../lib/CA.pm:110 +#: ../lib/CA.pm:270 +msgid "Invalid CA selected" +msgstr "Ogiltigt CA valt" + +#: ../lib/CA.pm:155 +msgid " Initializing OpenSSL" +msgstr " Initierar OpenSSL" + +#: ../lib/CA.pm:161 +msgid " Check for CA Version" +msgstr " Leta efter CA-version" + +#: ../lib/CA.pm:168 +#: ../lib/CA.pm:195 +msgid "Can't open index file: " +msgstr "Kan inte öppna indexfil: " + +#: ../lib/CA.pm:182 +msgid " Convert CA" +msgstr " Konvertera CA" + +#: ../lib/CA.pm:201 +msgid "Can't open index backup: " +msgstr "Kan inte öppna säkerhetskopia av index: " + +#: ../lib/CA.pm:218 +msgid "This CA is converted for openssl 0.9.7x now." +msgstr "Detta CA är nu konverterat till openssl 0.9.7.x." + +#: ../lib/CA.pm:220 +msgid "You will find a backup copy of the index file at: " +msgstr "Du kan hitta en säkerhetskopia av indexfilen i: " + +#: ../lib/CA.pm:229 +msgid " Read Configuration" +msgstr " Läs konfiguration" + +#: ../lib/CA.pm:235 +msgid " Create GUI" +msgstr " Skapa gränssnitt" + +#: ../lib/CA.pm:241 +msgid " Create Toolbar" +msgstr " Skapa verktygsrad" + +#: ../lib/CA.pm:247 +msgid " Actual CA: " +msgstr " Aktuellt CA: " + +#: ../lib/CA.pm:332 +#, c-format +msgid "CA: %s deleted" +msgstr "CA: %s borttagen" + +#: ../lib/CA.pm:386 +msgid "Password of parent CA is needed for creating a Sub CA" +msgstr "Lösenord för Huvud-CA behövs för att skapa ett Under-CA" + +#: ../lib/CA.pm:395 +msgid "Name must be filled in and must" +msgstr "Namn måste fyllas i och får" + +#: ../lib/CA.pm:396 +msgid " not contain Spaces" +msgstr " inte innehålla blanksteg" + +#: ../lib/CA.pm:408 +msgid "Please specify at least Common Name, " +msgstr "Vänligen ange åtminstone namn, " + +#: ../lib/CA.pm:409 +msgid "Country and Password" +msgstr "Land och lösenord" + +#: ../lib/CA.pm:416 +#: ../lib/REQ.pm:110 +msgid "Passwords don't match" +msgstr "Lösenorden stämmer inte överens" + +#: ../lib/CA.pm:424 +#: ../lib/REQ.pm:120 +msgid "Country must be exact 2 letter code" +msgstr "Land måste vara exakt 2 bokstäver" + +#: ../lib/CA.pm:428 +#, c-format +msgid "CA: %s already exists" +msgstr "CA: %s existerar redan" + +#: ../lib/CA.pm:468 +msgid "Name for storage must be filled in and must not contain spaces" +msgstr "Namn för lagring måste fyllas ut och får inte innehålla blanksteg" + +#: ../lib/CA.pm:477 +msgid "You didn't give a password for the private CA key." +msgstr "Du angav inte lösenordet för den privata CA-nyckeln." + +#: ../lib/CA.pm:479 +msgid "The import will fail, if the key is encrypted." +msgstr "Importering kommer att misslyckas om nyckeln är krypterad." + +#: ../lib/CA.pm:488 +msgid "Please give a new password for the CA" +msgstr "Ange ett nytt lösenord för CA" + +#: ../lib/CA.pm:495 +msgid "New passwords don't match" +msgstr "Nya lösenord stämmer inte överens" + +#: ../lib/CA.pm:503 +msgid "Please give a CA certificate to import" +msgstr "Välj ett CA-certifikat att importera" + +#: ../lib/CA.pm:508 +#, c-format +msgid "" +"Can't read CA certificate file:\n" +"%s" +msgstr "" +"Kan inte läsa CA-certifikatfil:\n" +"%s" + +#: ../lib/CA.pm:518 +msgid "Please give a CA keyfile to import" +msgstr "Välj en CA-nyckelfil att importera" + +#: ../lib/CA.pm:523 +#, c-format +msgid "" +"Can't read CA key file:\n" +"%s" +msgstr "" +"Kan inte läsa CA-nyckelfilen:\n" +"%s" + +#: ../lib/CA.pm:535 +msgid "Please give an Index file to import.\n" +msgstr "Välj en indexfil att importera.\n" + +#: ../lib/CA.pm:536 +msgid "If you don't have an Index file, i'll try to generate one.\n" +msgstr "Om du inte har en indexfil kan jag försöka att generera en.\n" + +#: ../lib/CA.pm:537 +msgid "Attention: This will cause all Certificates to show up as valid.\n" +msgstr "Lystring: Detta kommer att orsaka att alla certifikat kommer att visas som giltiga.\n" + +#: ../lib/CA.pm:538 +msgid "Attention: Revoked Certificates will not be determined." +msgstr "Varning: Återkallade certifikat kommer inte kunna fastställas." + +#: ../lib/CA.pm:549 +#, c-format +msgid "" +"Can't read Index file:\n" +"%s" +msgstr "" +"Kan inte läsa Index-fil:\n" +"%s" + +#: ../lib/CA.pm:562 +msgid "Please give a directory containing the certificates to import" +msgstr "Vänligen ange en katalog som innehåller certifikatet som ska importeras" + +#: ../lib/CA.pm:567 +#, c-format +msgid "" +"Can't find certificate directory:\n" +"%s" +msgstr "" +"Kan inte hitta certifikatkatalog:\n" +"%s" + +#: ../lib/CA.pm:578 +#, c-format +msgid "CA: %s already exists. Please choose another name" +msgstr "CA: %s existerar redan. Vänligen välj ett annat namn" + +#: ../lib/CA.pm:594 +msgid "Can't find X509v3 Basic Constraints in CA Certificate\n" +msgstr "Kan inte hitta X509v3 Basic Constraints i CA-certifikatet\n" + +#: ../lib/CA.pm:595 +msgid "Import canceled" +msgstr "Importering avbruten" + +#: ../lib/CA.pm:601 +msgid "The selected CA Certificate is no valid CA certificate\n" +msgstr "Det valda CA-certifikatet är inget giltigt CA-certifikat\n" + +#: ../lib/CA.pm:602 +#, c-format +msgid "X509v3 Basic Constraint is set to: %s" +msgstr "X509v3 Basic Constraint är satt till: %s" + +#: ../lib/CA.pm:612 +#, c-format +msgid "" +"Can't open Index file:\n" +"%s" +msgstr "" +"Kan inte öppna Index-fil:\n" +"%s" + +#: ../lib/CA.pm:663 +#: ../lib/CERT.pm:62 +#, c-format +msgid "Can't open Certificate directory: %s" +msgstr "Kan inte öppna certifikatkatalog: %s" + +#: ../lib/CA.pm:682 +#: ../lib/CERT.pm:85 +#, c-format +msgid " Read Certificate: %s" +msgstr " Läs certifikat: %s" + +#: ../lib/CA.pm:692 +#, c-format +msgid "Can't read Certificate file: %s" +msgstr "Kan inte läsa certifikatfil: %s" + +#: ../lib/CA.pm:716 +#, c-format +msgid "Can't write Certificate file: %s" +msgstr "Kan inte skriva certifikatfil: %s" + +#: ../lib/CA.pm:766 +#: ../lib/CA.pm:912 +msgid "Can't open Index file: " +msgstr "Kan inte öppna Index-fil: " + +#: ../lib/CA.pm:774 +#: ../lib/CA.pm:919 +msgid "Can't write Serial file: " +msgstr "Kan inte skriva serienummerfil: " + +#: ../lib/CA.pm:790 +#, c-format +msgid "Can't write CA Certificate file: %s" +msgstr "Kan inte skriva CA-certifikatfil: %s" + +#: ../lib/CA.pm:799 +#, c-format +msgid "Can't write CA Key file: %s" +msgstr "Kan inte skriva CA-nyckelfil: %s" + +#: ../lib/CA.pm:816 +#: ../lib/CA.pm:1140 +msgid "Generating CRL failed" +msgstr "Generering av CRL misslyckades" + +#: ../lib/CA.pm:829 +#, c-format +msgid "Succesfully imported %d certificates\n" +msgstr "Importering av %d certifikat lyckades\n" + +#: ../lib/CA.pm:830 +msgid "Check the configuration of your imported CA." +msgstr "Kontrollera konfigurationen av ditt importerade CA." + +#: ../lib/CA.pm:847 +#: ../lib/CA.pm:956 +msgid "No CA name given" +msgstr "Inget CA-namn angivet" + +#: ../lib/CA.pm:856 +#: ../lib/CA.pm:861 +#: ../lib/CA.pm:866 +#: ../lib/CA.pm:871 +#: ../lib/CA.pm:876 +#: ../lib/CA.pm:881 +msgid "Can't create directory: " +msgstr "Kan inte skapa katalog: " + +#: ../lib/CA.pm:890 +#, c-format +msgid "Can't open template file %s %s" +msgstr "Kan inte öppna mallfil %s %s" + +#: ../lib/CA.pm:895 +#: ../lib/CA.pm:1192 +#: ../lib/CA.pm:1259 +#: ../lib/CERT.pm:625 +#: ../lib/KEY.pm:234 +#: ../lib/REQ.pm:707 +#, c-format +msgid "Can't open output file: %s: %s" +msgstr "Kan inte öppna utdatafilen: %s: %s" + +#: ../lib/CA.pm:969 +#: ../lib/KEY.pm:476 +#: ../lib/REQ.pm:167 +msgid "Generating key failed" +msgstr "Generering av nyckel misslyckades" + +#: ../lib/CA.pm:1003 +#: ../lib/REQ.pm:193 +msgid "Generating Request failed" +msgstr "Generering av begäran misslyckades" + +#: ../lib/CA.pm:1012 +#: ../lib/CA.pm:1026 +#: ../lib/CERT.pm:103 +msgid "Can't read Certificate" +msgstr "Kan inte läsa certifikat" + +#: ../lib/CA.pm:1017 +#: ../lib/CA.pm:1031 +msgid "Can't write Certificate" +msgstr "Kan inte skriva certifikat" + +#: ../lib/CA.pm:1071 +msgid "Generating certificate failed" +msgstr "Generering av certifikat misslyckades" + +#: ../lib/CA.pm:1091 +#: ../lib/CA.pm:1116 +#, c-format +msgid "Can't open ca certificate file %s %s" +msgstr "Kan inte öppna CA-certifikatfil %s %s" + +#: ../lib/CA.pm:1100 +#, c-format +msgid "Can't create certificate chain file: %s: %s" +msgstr "Kan inte skapa fil för certifikatkedja: %s: %s" + +#: ../lib/CA.pm:1149 +#, c-format +msgid "CA: %s created" +msgstr "CA: %s skapades" + +#: ../lib/CA.pm:1184 +#, c-format +msgid "Can't open certificate chain file: %s: %s" +msgstr "Kan inte öppna fil för certifikatkedja: %s: %s" + +#: ../lib/CA.pm:1205 +#, c-format +msgid "Certificate Chain succesfully exported to: %s" +msgstr "Certifikatkedja exporterades till: %s" + +#: ../lib/CA.pm:1240 +#: ../lib/CERT.pm:575 +#: ../lib/GUI.pm:147 +#: ../lib/KEY.pm:350 +#: ../lib/REQ.pm:72 +#: ../lib/REQ.pm:396 +msgid "Can't read CA certificate" +msgstr "Kan inte läsa CA-certifikat" + +#: ../lib/CA.pm:1250 +#, c-format +msgid "Invalid Format for export_ca_cert(): %s" +msgstr "Ogiltigt format för export_ca_cert(): %s" + +#: ../lib/CA.pm:1272 +#, c-format +msgid "Certificate succesfully exported to: %s" +msgstr "Certifikat exporterades till: %s" + +#: ../lib/CA.pm:1305 +msgid "Please give the output file" +msgstr "Vänligen ange utdatafil" + +#: ../lib/CA.pm:1313 +msgid "Please give the CA password to create the Revocation List" +msgstr "Ange CA-lösenordet för att skapa spärrlistan" + +#: ../lib/CA.pm:1334 +msgid "" +"Wrong CA password given\n" +"Generating Revocation List failed" +msgstr "" +"Fel CA-lösenord angavs\n" +"Generering av spärrlista misslyckades" + +#: ../lib/CA.pm:1338 +msgid "" +"CA Key not found\n" +"Generating Revocation List failed" +msgstr "" +"CA-nyckel hittades inte\n" +"Generering av spärrlista misslyckades" + +#: ../lib/CA.pm:1342 +#: ../lib/CA.pm:1348 +msgid "Generating Revocation List failed" +msgstr "Generering av spärrlista misslyckades" + +#: ../lib/CA.pm:1356 +#, c-format +msgid "CRL successfully exported to: %s" +msgstr "CRL exporterades till: %s" + +#: ../lib/CERT.pm:144 +#: ../lib/CERT.pm:200 +#: ../lib/CERT.pm:323 +#: ../lib/CERT.pm:382 +#: ../lib/GUI.pm:830 +msgid "Please select a Certificate first" +msgstr "Vänligen välj ett certifikat först" + +#: ../lib/CERT.pm:152 +#: ../lib/CERT.pm:210 +#: ../lib/CERT.pm:334 +#: ../lib/CERT.pm:402 +#: ../lib/GUI.pm:2745 +#: ../lib/GUI.pm:2756 +#: ../lib/OpenSSL.pm:695 +#: ../lib/GUI/X509_browser.pm:278 +msgid "VALID" +msgstr "GILTIGT" + +#: ../lib/CERT.pm:154 +#, c-format +msgid "" +"Can't renew Certifikate with Status: %s\n" +"Please revoke the Certificate first" +msgstr "" +"Kan inte förnya certifikat med status: %s\n" +"Vänligen återkalla certifikatet först" + +#: ../lib/CERT.pm:169 +msgid "" +"Key and Request are necessary for renewal of a Certificate\n" +"Renewal is not possible!" +msgstr "" +"Nyckel och begäran är nödvändiga för att förnya ett certifikat\n" +"Förnyelse är inte möjlig!" + +#: ../lib/CERT.pm:211 +#, c-format +msgid "Can't revoke Certifikate with Status: %s" +msgstr "Kan inte återkalla certifikat med status: %s" + +#: ../lib/CERT.pm:257 +msgid "" +"Wrong CA password given\n" +"Revoking the Certificate failed" +msgstr "" +"Fel CA-lösenord angavs\n" +"Återkallelse av certifikatet misslyckades" + +#: ../lib/CERT.pm:264 +msgid "" +"CA Key not found\n" +"Revoking the Certificate failed" +msgstr "" +"CA-nyckel hittades inte\n" +"Återkallning av certifikat misslyckades" + +#: ../lib/CERT.pm:271 +msgid "Revoking the Certificate failed" +msgstr "Återkallning av certifikat misslyckades" + +#: ../lib/CERT.pm:291 +msgid "Generating a new Revocation List failed" +msgstr "Generering av ny spärrlista misslyckades" + +#: ../lib/CERT.pm:336 +msgid "" +"Can't delete VALID certificate!\n" +"Please revoke the Certificate first." +msgstr "" +"Kan inte ta bort ett GILTIGT certifikat!\n" +"Vänligen återkalla certifikatet först." + +#: ../lib/CERT.pm:403 +msgid "Certificate seems not to be VALID" +msgstr "Certifikatet verkar inte vara GILTIGT" + +#: ../lib/CERT.pm:405 +msgid "Export is not possible" +msgstr "Exportering är inte möjlig" + +#: ../lib/CERT.pm:430 +#: ../lib/KEY.pm:172 +msgid "Please give at least the output file" +msgstr "Ange åtminstone utdatafilen" + +#: ../lib/CERT.pm:436 +msgid "Key is necessary for export as PKCS#12" +msgstr "Nyckeln behövs för exportering som PKCS#12" + +#: ../lib/CERT.pm:438 +#: ../lib/CERT.pm:452 +#: ../lib/KEY.pm:264 +#: ../lib/KEY.pm:310 +msgid "Export is not possible!" +msgstr "Export är inte möjlig!" + +#: ../lib/CERT.pm:450 +msgid "Key is necessary for export as Zip" +msgstr "Nyckeln behövs för att exportera som Zip" + +#: ../lib/CERT.pm:489 +#: ../lib/KEY.pm:223 +#, c-format +msgid "Can't open Certificate file: %s: %s" +msgstr "Kan inte öppna certifikatfil: %s: %s" + +#: ../lib/CERT.pm:520 +#: ../lib/KEY.pm:292 +msgid "Generating PKCS#12 failed" +msgstr "Generering av PKCS#12 misslyckades" + +#: ../lib/CERT.pm:528 +#: ../lib/CERT.pm:604 +#: ../lib/KEY.pm:299 +#: ../lib/KEY.pm:375 +#, c-format +msgid "Certificate and Key successfully exported to %s" +msgstr "Certifikat och nyckel exporterades till %s" + +#: ../lib/CERT.pm:541 +#: ../lib/CERT.pm:562 +#: ../lib/REQ.pm:660 +#, c-format +msgid "Can't create temporary file: %s: %s" +msgstr "Kan inte skapa temporär fil: %s: %s" + +#: ../lib/CERT.pm:553 +#, c-format +msgid "Can't read Key file: %s: %s" +msgstr "Kan inte läsa nyckelfil: %s: %s" + +#: ../lib/CERT.pm:583 +#: ../lib/KEY.pm:323 +#: ../lib/KEY.pm:339 +#: ../lib/KEY.pm:357 +msgid "Can't create temporary file" +msgstr "Kan inte skapa temporär fil" + +#: ../lib/CERT.pm:598 +#: ../lib/KEY.pm:370 +msgid "Generating Zip file failed" +msgstr "Generering av Zip-fil misslyckades" + +#: ../lib/CERT.pm:616 +#, c-format +msgid "Invalid Format for export_cert(): %s" +msgstr "Ogiltigt format för export_cert(): %s" + +#: ../lib/CERT.pm:636 +#, c-format +msgid "Certificate successfully exported to: %s" +msgstr "Certifikat exporterades till: %s" + +#: ../lib/GUI.pm:152 +#: ../lib/GUI.pm:159 +msgid "CA" +msgstr "CA" + +#: ../lib/GUI.pm:166 +msgid "CA Information" +msgstr "CA-information" + +#: ../lib/GUI.pm:185 +msgid "Certificates" +msgstr "Certifikat" + +#: ../lib/GUI.pm:225 +#: ../lib/GUI.pm:2728 +#: ../lib/GUI/WORDS.pm:58 +#: ../lib/GUI/X509_browser.pm:162 +#: ../lib/GUI/X509_browser.pm:170 +#: ../lib/GUI/X509_browser.pm:179 +msgid "Common Name" +msgstr "Namn" + +#: ../lib/GUI.pm:226 +#: ../lib/GUI.pm:1252 +#: ../lib/GUI.pm:2320 +#: ../lib/GUI/WORDS.pm:59 +#: ../lib/GUI/X509_browser.pm:163 +#: ../lib/GUI/X509_browser.pm:171 +#: ../lib/GUI/X509_browser.pm:180 +msgid "eMail Address" +msgstr "E-postadress" + +#: ../lib/GUI.pm:227 +#: ../lib/GUI/WORDS.pm:61 +#: ../lib/GUI/X509_browser.pm:164 +#: ../lib/GUI/X509_browser.pm:172 +#: ../lib/GUI/X509_browser.pm:181 +msgid "Organizational Unit" +msgstr "Organisationsenhet" + +#: ../lib/GUI.pm:228 +#: ../lib/GUI/WORDS.pm:60 +#: ../lib/GUI/X509_browser.pm:165 +#: ../lib/GUI/X509_browser.pm:173 +#: ../lib/GUI/X509_browser.pm:182 +msgid "Organization" +msgstr "Organisation" + +#: ../lib/GUI.pm:229 +#: ../lib/GUI/WORDS.pm:62 +#: ../lib/GUI/X509_browser.pm:166 +#: ../lib/GUI/X509_browser.pm:174 +#: ../lib/GUI/X509_browser.pm:183 +msgid "Location" +msgstr "Plats" + +#: ../lib/GUI.pm:230 +#: ../lib/GUI/WORDS.pm:63 +#: ../lib/GUI/X509_browser.pm:167 +#: ../lib/GUI/X509_browser.pm:175 +#: ../lib/GUI/X509_browser.pm:184 +msgid "State" +msgstr "Län" + +#: ../lib/GUI.pm:231 +#: ../lib/GUI/WORDS.pm:64 +#: ../lib/GUI/X509_browser.pm:168 +#: ../lib/GUI/X509_browser.pm:176 +#: ../lib/GUI/X509_browser.pm:185 +msgid "Country" +msgstr "Land" + +#: ../lib/GUI.pm:232 +#: ../lib/GUI/WORDS.pm:70 +#: ../lib/GUI/X509_browser.pm:186 +msgid "Type" +msgstr "Typ" + +#: ../lib/GUI.pm:246 +msgid "Keys" +msgstr "Tangenter" + +#: ../lib/GUI.pm:289 +msgid "Requests" +msgstr "Begäran" + +#: ../lib/GUI.pm:378 +#, c-format +msgid " Actual CA: %s" +msgstr " Aktuellt CA: %s" + +#: ../lib/GUI.pm:381 +#, c-format +msgid " Actual CA: %s - Certificates" +msgstr " Aktuellt CA: %s - Certifikat" + +#: ../lib/GUI.pm:384 +#, c-format +msgid " Actual CA: %s - Keys" +msgstr " Aktuellt CA: %s - Nycklar" + +#: ../lib/GUI.pm:387 +#, c-format +msgid " Actual CA: %s - Requests" +msgstr " Aktuellt CA: %s - Begäran" + +#: ../lib/GUI.pm:436 +#: ../lib/GUI.pm:1120 +msgid "Open CA" +msgstr "Öppna CA" + +#: ../lib/GUI.pm:442 +msgid "New CA" +msgstr "Nytt CA" + +#: ../lib/GUI.pm:448 +#: ../lib/GUI.pm:2422 +msgid "Import CA" +msgstr "Importera CA" + +#: ../lib/GUI.pm:454 +#: ../lib/GUI.pm:1122 +msgid "Delete CA" +msgstr "Ta bort CA" + +#: ../lib/GUI.pm:464 +#: ../lib/GUI.pm:503 +#: ../lib/GUI.pm:571 +msgid "Details" +msgstr "Detaljer" + +#: ../lib/GUI.pm:470 +msgid "History" +msgstr "Historik" + +#: ../lib/GUI.pm:476 +msgid "Sub CA" +msgstr "Under-CA" + +#: ../lib/GUI.pm:482 +msgid "Export CA" +msgstr "Exportera CA" + +#: ../lib/GUI.pm:488 +#: ../lib/GUI.pm:1462 +msgid "Export CRL" +msgstr "Exportera CRL" + +#: ../lib/GUI.pm:495 +msgid "Export Chain" +msgstr "Exportera kedja" + +#: ../lib/GUI.pm:509 +#: ../lib/GUI.pm:577 +msgid "View" +msgstr "Visa" + +#: ../lib/GUI.pm:519 +#: ../lib/GUI.pm:583 +msgid "New" +msgstr "Ny" + +#: ../lib/GUI.pm:526 +#: ../lib/GUI.pm:557 +msgid "Export" +msgstr "Exportera" + +#: ../lib/GUI.pm:532 +msgid "Revoke" +msgstr "Återkalla" + +#: ../lib/GUI.pm:542 +msgid "Renew" +msgstr "Förnya" + +#: ../lib/GUI.pm:549 +#: ../lib/GUI.pm:563 +#: ../lib/GUI.pm:606 +msgid "Delete" +msgstr "Ta bort" + +#: ../lib/GUI.pm:589 +msgid "Import" +msgstr "Importera" + +#: ../lib/GUI.pm:599 +msgid "Sign" +msgstr "Signera" + +#: ../lib/GUI.pm:625 +msgid "_CA" +msgstr "_CA" + +#: ../lib/GUI.pm:628 +msgid "_Open CA" +msgstr "Ö_ppna CA" + +#: ../lib/GUI.pm:633 +msgid "_New CA" +msgstr "_Nytt CA" + +#: ../lib/GUI.pm:638 +msgid "_Delete CA" +msgstr "_Ta bort CA" + +#: ../lib/GUI.pm:646 +msgid "_Exit" +msgstr "_Avsluta" + +#: ../lib/GUI.pm:653 +msgid "_Preferences" +msgstr "_Inställningar" + +#: ../lib/GUI.pm:656 +msgid "Experts Only!!" +msgstr "Endast för experter!!" + +#: ../lib/GUI.pm:661 +msgid "OpenSSL _Configuration" +msgstr "Konfiguration av _OpenSSL" + +#: ../lib/GUI.pm:668 +#: ../lib/GUI.pm:671 +msgid "_Help" +msgstr "_Hjälp" + +#: ../lib/GUI.pm:676 +msgid "_About TinyCA" +msgstr "_Om TinyCA" + +#: ../lib/GUI.pm:707 +msgid "Invalid mode for show_text():" +msgstr "Ogiltigt läge för show_text():" + +#: ../lib/GUI.pm:712 +#: ../lib/GUI.pm:827 +#: ../lib/REQ.pm:236 +#: ../lib/REQ.pm:367 +msgid "Please select a Request first" +msgstr "Vänligen välj en begäran först" + +#: ../lib/GUI.pm:715 +msgid "Please select a certificate first" +msgstr "Vänligen välj ett certifikat först" + +#: ../lib/GUI.pm:731 +#: ../lib/GUI.pm:846 +#: ../lib/GUI/X509_browser.pm:458 +#: ../lib/GUI/X509_browser.pm:517 +msgid "Can't read file" +msgstr "Kan inte läsa fil" + +#: ../lib/GUI.pm:733 +msgid "Request" +msgstr "Begäran" + +#: ../lib/GUI.pm:733 +msgid "Certificate" +msgstr "Certifikat" + +#: ../lib/GUI.pm:794 +#, c-format +msgid "Invalid mode for _show_popup_menu(): %s" +msgstr "Ogiltigt läge för _show_popup_menu(): %s" + +#: ../lib/GUI.pm:822 +msgid "Invalid mode for show_details():" +msgstr "Ogiltigt läge för show_details():" + +#: ../lib/GUI.pm:848 +#: ../lib/GUI.pm:948 +#: ../lib/GUI.pm:3079 +msgid "Request Details" +msgstr "Detaljer om begäran" + +#: ../lib/GUI.pm:848 +#: ../lib/GUI.pm:948 +#: ../lib/GUI.pm:2936 +msgid "Certificate Details" +msgstr "Certifikatdetaljer" + +#: ../lib/GUI.pm:890 +#: ../lib/GUI.pm:1722 +#: ../lib/GUI.pm:3100 +msgid "Import Request" +msgstr "Importera begäran" + +#: ../lib/GUI.pm:892 +#: ../lib/GUI.pm:2478 +msgid "Import CA Certificate" +msgstr "Importera CA-certifikat" + +#: ../lib/GUI.pm:900 +msgid "Do you want to import the following Certificate Request?" +msgstr "Vill du importera följande certifikatbegäran?" + +#: ../lib/GUI.pm:902 +msgid "Do you want to import the following CA Certificate?" +msgstr "Vill du importera följande CA-certifikat?" + +#: ../lib/GUI.pm:956 +msgid "Subject DN" +msgstr "Ämne DN" + +#: ../lib/GUI.pm:980 +msgid "Issuer" +msgstr "Utgivare" + +#: ../lib/GUI.pm:1006 +msgid "Validity" +msgstr "Giltighet" + +#: ../lib/GUI.pm:1022 +msgid "Key/Request Details:" +msgstr "Detaljer om nyckel/begäran:" + +#: ../lib/GUI.pm:1022 +msgid "Key/Certificate Details:" +msgstr "Detaljer om nyckel/certifikat:" + +#: ../lib/GUI.pm:1038 +msgid "Fingerprints" +msgstr "Fingeravtryck" + +#: ../lib/GUI.pm:1054 +msgid "Requested X.509 Extensions" +msgstr "Begärde X.509v3-utökningar" + +#: ../lib/GUI.pm:1054 +msgid "X.509v3 Extensions" +msgstr "X.509v3-utökningar" + +#: ../lib/GUI.pm:1079 +msgid "Requested Netscape Extensions" +msgstr "Begärde Netscape-utökningar" + +#: ../lib/GUI.pm:1079 +msgid "Netscape Extensions" +msgstr "Netscape-utökningar" + +#: ../lib/GUI.pm:1124 +msgid "Invalid action given: " +msgstr "Ogiltig åtgärd angavs: " + +#: ../lib/GUI.pm:1146 +#: ../lib/GUI.pm:1192 +msgid "Invalid action for show_select_ca_dialog(): " +msgstr "Ogiltig åtgärd för show_select_ca_dialog(): " + +#: ../lib/GUI.pm:1168 +msgid "Available CAs" +msgstr "Tillgängliga CA:er" + +#: ../lib/GUI.pm:1224 +msgid "Create Request" +msgstr "Skapa begäran" + +#: ../lib/GUI.pm:1225 +msgid "Create a new Certificate Request" +msgstr "Skapa en ny certifikatbegäran" + +#: ../lib/GUI.pm:1239 +msgid "Common Name (eg, your Name," +msgstr "Namn (till exempel ditt namn," + +#: ../lib/GUI.pm:1244 +msgid "your eMail Address" +msgstr "din e-postadress" + +#: ../lib/GUI.pm:1248 +msgid "or the Servers Name)" +msgstr "eller serverns namn)" + +#: ../lib/GUI.pm:1256 +msgid "Password (protect your private Key):" +msgstr "Lösenord (skydda din privata nyckel):" + +#: ../lib/GUI.pm:1260 +#: ../lib/GUI.pm:2300 +msgid "Password (confirmation):" +msgstr "Lösenord (bekräfta):" + +#: ../lib/GUI.pm:1264 +#: ../lib/GUI.pm:2292 +msgid "Country Name (2 letter code):" +msgstr "Land (2-bokstavskod):" + +#: ../lib/GUI.pm:1268 +#: ../lib/GUI.pm:2304 +msgid "State or Province Name:" +msgstr "Län eller provins:" + +#: ../lib/GUI.pm:1272 +#: ../lib/GUI.pm:2308 +msgid "Locality Name (eg. city):" +msgstr "Plats (exempelvis stad):" + +#: ../lib/GUI.pm:1276 +#: ../lib/GUI.pm:2312 +msgid "Organization Name (eg. company):" +msgstr "Organisation (exempelvis företag):" + +#: ../lib/GUI.pm:1282 +#: ../lib/GUI.pm:1287 +#: ../lib/GUI.pm:2316 +msgid "Organizational Unit Name (eg. section):" +msgstr "Organisationsenhet (exempelvis avdelning):" + +#: ../lib/GUI.pm:1292 +#: ../lib/GUI.pm:2328 +#: ../lib/GUI/WORDS.pm:67 +msgid "Keylength" +msgstr "Nyckellängd" + +#: ../lib/GUI.pm:1320 +#: ../lib/GUI.pm:2358 +msgid "Digest" +msgstr "Sammandrag" + +#: ../lib/GUI.pm:1361 +msgid "Algorithm" +msgstr "Algoritm" + +#: ../lib/GUI.pm:1403 +#: ../lib/GUI.pm:2957 +msgid "Revoke Certificate" +msgstr "Återkalla certifikat" + +#: ../lib/GUI.pm:1412 +#: ../lib/GUI.pm:1487 +#: ../lib/GUI.pm:2099 +msgid "CA Password:" +msgstr "CA-lösenord:" + +#: ../lib/GUI.pm:1417 +msgid "Revocation Reason:" +msgstr "Anledning för återkallelse:" + +#: ../lib/GUI.pm:1462 +msgid "Export Revocation List to File" +msgstr "Exportera spärrlista till fil" + +#: ../lib/GUI.pm:1470 +#: ../lib/GUI.pm:1558 +#: ../lib/GUI.pm:1606 +#: ../lib/GUI.pm:1730 +#: ../lib/GUI.pm:1798 +msgid "File:" +msgstr "Fil:" + +#: ../lib/GUI.pm:1481 +#: ../lib/GUI.pm:1569 +#: ../lib/GUI.pm:1617 +#: ../lib/GUI.pm:1740 +#: ../lib/GUI.pm:1815 +#: ../lib/GUI.pm:2475 +#: ../lib/GUI.pm:2494 +#: ../lib/GUI.pm:2513 +#: ../lib/GUI.pm:2532 +msgid "Browse..." +msgstr "Bläddra..." + +#: ../lib/GUI.pm:1484 +#: ../lib/GUI.pm:1597 +#: ../lib/GUI.pm:1620 +msgid "Export CA Certificate" +msgstr "Exportera CA-certifikat" + +#: ../lib/GUI.pm:1491 +#: ../lib/GUI.pm:2105 +#: ../lib/GUI.pm:2324 +msgid "Valid for (Days):" +msgstr "Giltighet (i dagar):" + +#: ../lib/GUI.pm:1495 +#: ../lib/GUI.pm:1624 +#: ../lib/GUI.pm:1822 +msgid "Export Format:" +msgstr "Exportformat:" + +#: ../lib/GUI.pm:1501 +#: ../lib/GUI.pm:1630 +msgid "PEM" +msgstr "PEM" + +#: ../lib/GUI.pm:1510 +#: ../lib/GUI.pm:1639 +msgid "DER" +msgstr "DER" + +#: ../lib/GUI.pm:1519 +#: ../lib/GUI.pm:1648 +msgid "TXT" +msgstr "TXT" + +#: ../lib/GUI.pm:1550 +#: ../lib/GUI.pm:1572 +msgid "Export CA Certificate Chain" +msgstr "Exportera CA-certifikatkedja" + +#: ../lib/GUI.pm:1551 +msgid "Export CA Certificate Chain to File" +msgstr "Exportera CA-certifikatkedja till fil" + +#: ../lib/GUI.pm:1598 +msgid "Export CA Certificate to File" +msgstr "Exportera CA-certifikat till fil" + +#: ../lib/GUI.pm:1678 +#: ../lib/GUI.pm:1679 +msgid "Export Key without Passphrase" +msgstr "Exportera nyckel utan lösenfras" + +#: ../lib/GUI.pm:1683 +msgid "I hope you know what you're doing?" +msgstr "Jag hoppas du vet vad du gör?" + +#: ../lib/GUI.pm:1687 +msgid "The Key Passphrase is needed for decryption of the Key" +msgstr "Nyckelns lösenfras behövs för att dekryptera nyckeln" + +#: ../lib/GUI.pm:1696 +msgid "Password:" +msgstr "Lösenord:" + +#: ../lib/GUI.pm:1722 +#: ../lib/GUI.pm:1743 +msgid "Import Request from File" +msgstr "Importera begäran från fil" + +#: ../lib/GUI.pm:1764 +#: ../lib/GUI.pm:1802 +#: ../lib/GUI.pm:2950 +msgid "Export Certificate" +msgstr "Exportera certifikat" + +#: ../lib/GUI.pm:1766 +#: ../lib/GUI.pm:1804 +#: ../lib/GUI.pm:2907 +msgid "Export Key" +msgstr "Exportera nyckel" + +#: ../lib/GUI.pm:1769 +msgid "Invalid mode for show_export_dialog(): " +msgstr "Ogiltigt läge för show_export_dialog(): " + +#: ../lib/GUI.pm:1786 +msgid "Export Certificate to File" +msgstr "Exportera certifikat till fil" + +#: ../lib/GUI.pm:1788 +msgid "Export Key to File" +msgstr "Exportera nyckel till fil" + +#: ../lib/GUI.pm:1826 +msgid "PEM (Certificate)" +msgstr "PEM (Certifikat)" + +#: ../lib/GUI.pm:1828 +msgid "PEM (Key)" +msgstr "PEM (Nyckel)" + +#: ../lib/GUI.pm:1837 +msgid "DER (Certificate)" +msgstr "DER (Certifikat)" + +#: ../lib/GUI.pm:1839 +msgid "DER (Key without Passphrase)" +msgstr "DER (Nyckel utan lösenfras)" + +#: ../lib/GUI.pm:1847 +msgid "PKCS#12 (Certificate & Key)" +msgstr "PKCS#12 (Certifikat & Nyckel)" + +#: ../lib/GUI.pm:1854 +msgid "Zip (Certificate & Key)" +msgstr "Zip (Certifikat & Nyckel)" + +#: ../lib/GUI.pm:1866 +msgid "TXT (Certificate)" +msgstr "TXT (Certifikat)" + +#: ../lib/GUI.pm:1872 +msgid "Without Passphrase (PEM)" +msgstr "Utan lösenfras (PEM)" + +#: ../lib/GUI.pm:1878 +#: ../lib/GUI.pm:1898 +#: ../lib/GUI.pm:1915 +#: ../lib/GUI.pm:1935 +#: ../lib/GUI.pm:2051 +#: ../lib/GUI.pm:2202 +msgid "Yes" +msgstr "Ja" + +#: ../lib/GUI.pm:1883 +#: ../lib/GUI.pm:1903 +#: ../lib/GUI.pm:1920 +#: ../lib/GUI.pm:1940 +#: ../lib/GUI.pm:2059 +#: ../lib/GUI.pm:2208 +msgid "No" +msgstr "Nej" + +#: ../lib/GUI.pm:1892 +msgid "Include Key (PEM)" +msgstr "Inkludera nyckel (PEM)" + +#: ../lib/GUI.pm:1909 +msgid "Include Certificate (PEM)" +msgstr "Inkludera certifikat (PEM)" + +#: ../lib/GUI.pm:1929 +msgid "Include Fingerprint (PEM)" +msgstr "Inkludera fingeravtryck (PEM)" + +#: ../lib/GUI.pm:2029 +#: ../lib/GUI.pm:2030 +msgid "Export to PKCS#12" +msgstr "Exportera till PKCS#12" + +#: ../lib/GUI.pm:2037 +msgid "Key Password:" +msgstr "Lösenord för nyckel:" + +#: ../lib/GUI.pm:2041 +msgid "Export Password:" +msgstr "Lösenord för export:" + +#: ../lib/GUI.pm:2045 +msgid "Add CA Certificate to PKCS#12 structure" +msgstr "Lägg till CA-certifikat till PKCS#12-struktur" + +#: ../lib/GUI.pm:2091 +#: ../lib/GUI.pm:3107 +msgid "Sign Request" +msgstr "Signera begäran" + +#: ../lib/GUI.pm:2091 +msgid "Sign Request/Create Certificate" +msgstr "Signera begäran/Skapa certifikat" + +#: ../lib/GUI.pm:2116 +#: ../lib/GUI.pm:2161 +msgid "Subject alternative name (IP Address):" +msgstr "Ämne alternativt namn (IP-adress):" + +#: ../lib/GUI.pm:2119 +#: ../lib/GUI.pm:2164 +msgid "Subject alternative name (DNS Name):" +msgstr "Ämne alternativt namn (DNS-namn):" + +#: ../lib/GUI.pm:2122 +#: ../lib/GUI.pm:2170 +msgid "Subject alternative name (raw):" +msgstr "Ämne alternativt namn (rå):" + +#: ../lib/GUI.pm:2130 +#: ../lib/GUI.pm:2178 +msgid "Extended Key Usage:" +msgstr "Utökad nyckelanvändning:" + +#: ../lib/GUI.pm:2137 +msgid "Netscape SSL Server Name:" +msgstr "Netscape SSL-servernamn:" + +#: ../lib/GUI.pm:2144 +#: ../lib/GUI.pm:2185 +msgid "Netscape Revocation URL:" +msgstr "Netscape återkallnings-URL:" + +#: ../lib/GUI.pm:2151 +#: ../lib/GUI.pm:2192 +msgid "Netscape Renewal URL:" +msgstr "Netscape förnyelse-URL:" + +#: ../lib/GUI.pm:2167 +msgid "Subject alternative name (eMail Address):" +msgstr "Ämne alternativt namn (e-postadress):" + +#: ../lib/GUI.pm:2214 +msgid "Add eMail Address to Subject DN:" +msgstr "Lägg till e-postadress till Ämnes DN:" + +#: ../lib/GUI.pm:2244 +#: ../lib/GUI.pm:2248 +msgid "Create CA" +msgstr "Skapa CA" + +#: ../lib/GUI.pm:2244 +msgid "Create a new Sub CA" +msgstr "Skapa ett nytt Under-CA" + +#: ../lib/GUI.pm:2248 +msgid "Create a new CA" +msgstr "Skapa ett nytt CA" + +#: ../lib/GUI.pm:2261 +msgid "CA Password (for creating the new CA):" +msgstr "CA-lösenord (för att skapa nytt CA):" + +#: ../lib/GUI.pm:2272 +#: ../lib/GUI.pm:2443 +msgid "Name (for local storage):" +msgstr "Namn (för lokal lagring):" + +#: ../lib/GUI.pm:2279 +msgid "Data for CA Certificate" +msgstr "Data för CA-certifikat" + +#: ../lib/GUI.pm:2288 +msgid "Common Name (for the CA):" +msgstr "Namn (för CA):" + +#: ../lib/GUI.pm:2296 +msgid "Password (needed for signing):" +msgstr "Lösenord (behövs för signering):" + +#: ../lib/GUI.pm:2422 +msgid "Import an existing CA into TinyCA" +msgstr "Importera ett existerande CA till TinyCA" + +#: ../lib/GUI.pm:2433 +msgid "Password of the private CA key (Needed for import):" +msgstr "Lösenord för den privata CA-nyckeln (behövs för import):" + +#: ../lib/GUI.pm:2447 +msgid "New password for the CA:" +msgstr "Nytt lösenord för CA:" + +#: ../lib/GUI.pm:2451 +msgid "Confirm password:" +msgstr "Bekräfta lösenord:" + +#: ../lib/GUI.pm:2456 +msgid "Files/Directories to import" +msgstr "Filer/Kataloger att importera" + +#: ../lib/GUI.pm:2464 +msgid "CA Certificate (PEM/DER):" +msgstr "CA-certifikat (PEM/DER):" + +#: ../lib/GUI.pm:2483 +msgid "CA private key (PEM/DER):" +msgstr "Privat CA-nyckel (PEM/DER):" + +#: ../lib/GUI.pm:2497 +msgid "Import CA private Key" +msgstr "Importera privat nyckel för CA" + +#: ../lib/GUI.pm:2502 +msgid "OpenSSL Index File (index.txt):" +msgstr "OpenSSL Indexfil (index.txt):" + +#: ../lib/GUI.pm:2516 +msgid "Import Index File" +msgstr "Importera indexfil" + +#: ../lib/GUI.pm:2521 +msgid "Directory containing certificates (PEM/DER):" +msgstr "Katalog som innehåller certifikat (PEM/DER):" + +#: ../lib/GUI.pm:2535 +msgid "Import Certificates from directory" +msgstr "Importera certifikat från katalog" + +#: ../lib/GUI.pm:2549 +msgid "You are kidding, are you??" +msgstr "Skämtar du??" + +#: ../lib/GUI.pm:2570 +msgid "Spanish: Ramon Pons Vivanco " +msgstr "Spanska: Ramon Pons Vivanco " + +#: ../lib/GUI.pm:2571 +msgid "Czech: Robert Wolf " +msgstr "Tjeckiska: Robert Wolf " + +#: ../lib/GUI.pm:2572 +msgid "French: Thibault Le Meur " +msgstr "Franska: Thibault Le Meur " + +#: ../lib/GUI.pm:2588 +msgid "Do you really want to delete the selected Request?" +msgstr "Vill du verkligen ta bort den valda begäran?" + +#: ../lib/GUI.pm:2590 +msgid "Do you really want to delete the selected Key?" +msgstr "Vill du verkligen ta bort den valda nyckeln?" + +#: ../lib/GUI.pm:2592 +msgid "Do you really want to delete the selected Certificate?" +msgstr "Vill du verkligen ta bort det valda certifikatet?" + +#: ../lib/GUI.pm:2642 +msgid "Overwrite Request/Key" +msgstr "Skriv över begäran/nyckel" + +#: ../lib/GUI.pm:2648 +msgid "The Key or the Request is already existing!" +msgstr "Nyckeln eller begäran existerar redan!" + +#: ../lib/GUI.pm:2653 +msgid "You won't be able to sign this Request" +msgstr "Du kommer inte att kunna signera denna begäran" + +#: ../lib/GUI.pm:2658 +msgid "if the corresponding certificate is still valid" +msgstr "om det korresponderande certifikatet är giltigt fortfarande" + +#: ../lib/GUI.pm:2675 +msgid "The Certificate will be longer valid than your CA!" +msgstr "Certifikatet kommer vara giltigt längre än ditt CA!" + +#: ../lib/GUI.pm:2677 +msgid "This may cause problems with some software!!" +msgstr "Det här kan orsaka problem med vissa programvara!!" + +#: ../lib/GUI.pm:2692 +msgid "Expirationdate Warning" +msgstr "Utgångsdatumsvarning" + +#: ../lib/GUI.pm:2727 +#: ../lib/GUI/WORDS.pm:71 +msgid "Serial" +msgstr "Serienummer" + +#: ../lib/GUI.pm:2729 +#: ../lib/GUI/WORDS.pm:72 +#: ../lib/GUI/X509_browser.pm:177 +msgid "Status" +msgstr "Status" + +#: ../lib/GUI.pm:2730 +#: ../lib/GUI/WORDS.pm:66 +msgid "Expiration Date" +msgstr "Datum för utgång" + +#: ../lib/GUI.pm:2731 +msgid "Revocation Date" +msgstr "Datum för återkallning" + +#: ../lib/GUI.pm:2732 +msgid "Revocation Reason" +msgstr "Anledning för återkallning" + +#: ../lib/GUI.pm:2758 +#: ../lib/OpenSSL.pm:698 +msgid "EXPIRED" +msgstr "UTGÅNGET" + +#: ../lib/GUI.pm:2760 +#: ../lib/OpenSSL.pm:711 +msgid "REVOKED" +msgstr "ÅTERKALLAT" + +#: ../lib/GUI.pm:2780 +msgid "CA History" +msgstr "CA-historik" + +#: ../lib/GUI.pm:2814 +msgid "Overwrite Certificate" +msgstr "Skriv över certifikat" + +#: ../lib/GUI.pm:2820 +msgid "There seems to be a certificate with the same Subject already." +msgstr "Det verkar finnas ett certifikat med samma Ämne redan." + +#: ../lib/GUI.pm:2825 +msgid "Creating a new one (overwrite) will fail if it's not revoked or expired!" +msgstr "Skapa ett nytt (skriva över) kommer att misslyckas om det inte är återkallat eller utgånget!" + +#: ../lib/GUI.pm:2831 +msgid "Really try to overwrite the Certificate?" +msgstr "Verkligen försöka att skriva över certifikatet?" + +#: ../lib/GUI.pm:2864 +msgid "Convert CA" +msgstr "Konvertera CA" + +#: ../lib/GUI.pm:2872 +msgid "This CA seems to be created with openssl 0.9.6x. And it seems like you have switched to openssl 0.9.7x." +msgstr "Detta CA verkar vara skapade med OpenSSL 0.9.6x.. och det verkar som om du har bytt till OpenSSL 0.9.7x." + +#: ../lib/GUI.pm:2880 +msgid "You won't be able to revoke the existing certificates without converting the index file of this CA to the new format." +msgstr "Du kommer inte kunna återkalla existerande certifikat utan att konvertera indexfilen av det här CA:t till nya formatet." + +#: ../lib/GUI.pm:2888 +msgid "Attention: it will not be easy to switch back, this has to be done manually" +msgstr "Tänk på att det är inte lätt att byta tillbaka, det måste göras manuellt" + +#: ../lib/GUI.pm:2914 +msgid "Delete Key" +msgstr "Ta bort nyckel" + +#: ../lib/GUI.pm:2943 +msgid "View Certificate" +msgstr "Visa certifikat" + +#: ../lib/GUI.pm:2964 +msgid "Renew Certificate" +msgstr "Förnya certifikat" + +#: ../lib/GUI.pm:2972 +msgid "Delete Certificate" +msgstr "Ta bort certifikat" + +#: ../lib/GUI.pm:2995 +msgid "Create Key and Certificate (Server)" +msgstr "Skapa nyckel och certifikat (Server)" + +#: ../lib/GUI.pm:3001 +msgid "Create Key and Certificate (Client)" +msgstr "Skapa nyckel och certifikat (Klient)" + +#: ../lib/GUI.pm:3022 +msgid "Renew Certificate (Server)" +msgstr "Förnya certifikat (Server)" + +#: ../lib/GUI.pm:3029 +msgid "Renew Certificate (Client)" +msgstr "Förnya certifikat (Klient)" + +#: ../lib/GUI.pm:3051 +msgid "Sign Request (Server)" +msgstr "Signera begäran (Server)" + +#: ../lib/GUI.pm:3058 +msgid "Sign Request (Client)" +msgstr "Signera begäran (Klient)" + +#: ../lib/GUI.pm:3086 +msgid "View Request" +msgstr "Visa begäran" + +#: ../lib/GUI.pm:3093 +msgid "New Request" +msgstr "Ny begäran" + +#: ../lib/GUI.pm:3115 +msgid "Delete Request" +msgstr "Ta bort begäran" + +#: ../lib/HELPERS.pm:207 +#, c-format +msgid "Can't write exportdir: %s, %s" +msgstr "Kan inte skriva till exportkatalog: %s, %s" + +#: ../lib/KEY.pm:46 +#: ../lib/KEY.pm:138 +msgid "Please select a Key first" +msgstr "Välj en nyckel först" + +#: ../lib/KEY.pm:55 +msgid "Key file not found:" +msgstr "Nyckelfil hittades inte:" + +#: ../lib/KEY.pm:102 +msgid "Can't open key directory" +msgstr "Kan inte öppna nyckelkatalog" + +#: ../lib/KEY.pm:179 +msgid "Can't export PKCS#12 without passphrase" +msgstr "Kan inte exportera PKCS#12 utan lösenfras" + +#: ../lib/KEY.pm:201 +msgid "" +"Wrong password given\n" +"Decrypting of the Key failed\n" +"Export is not possible" +msgstr "" +"Fel lösenord angavs\n" +"Dekryptering av nyckeln misslyckades\n" +"Exportering är inte möjlig" + +#: ../lib/KEY.pm:206 +msgid "Converting failed, Export not possible" +msgstr "Konvertering misslyckades, exportering inte möjlig" + +#: ../lib/KEY.pm:213 +#: ../lib/KEY.pm:404 +#, c-format +msgid "Can't open Key file: %s: %s" +msgstr "Kan inte öppna nyckelfil: %s: %s" + +#: ../lib/KEY.pm:246 +#, c-format +msgid "Key succesfully exported to %s" +msgstr "Nyckel exporterad till %s" + +#: ../lib/KEY.pm:262 +msgid "Certificate is necessary for export as PKCS#12" +msgstr "Certifikat är nödvändigt för exportering som PKCS#12" + +#: ../lib/KEY.pm:308 +msgid "Certificate is necessary for export as Zip file" +msgstr "Certifikat är nödvändigt för export som Zip-fil" + +#: ../lib/KEY.pm:332 +msgid "Can't read Key file" +msgstr "Kan inte läsa nyckelfil" + +#: ../lib/KEY.pm:386 +#, c-format +msgid "Invalid format for export requested: %s" +msgstr "Ogiltigt format för export begärdes: %s" + +#: ../lib/KEY.pm:392 +msgid "Something Failed ??" +msgstr "Något gick fel ??" + +#: ../lib/KEY.pm:442 +#, c-format +msgid "" +"Can't open Key file:\n" +"%s" +msgstr "" +"Kan inte öppna nyckelfil:\n" +"%s" + +#: ../lib/KEY.pm:479 +msgid "The password for your old CA Key is wrong" +msgstr "Lösenordet för din gamla CA-nyckel är felaktigt" + +#: ../lib/OpenSSL.pm:70 +msgid "Creating DSA key in progress..." +msgstr "Skapande av DSA-nyckel pågår..." + +#: ../lib/OpenSSL.pm:104 +msgid "Creating RSA key in progress..." +msgstr "Skapande av RSA-nyckel pågår..." + +#: ../lib/OpenSSL.pm:449 +#, c-format +msgid "Can't open CRL '%s': %s" +msgstr "Kan inte öppna CRL \"%s\": %s" + +#: ../lib/OpenSSL.pm:464 +#: ../lib/OpenSSL.pm:477 +msgid "Error converting CRL" +msgstr "Fel vid konvertering av CRL" + +#: ../lib/OpenSSL.pm:575 +#: ../lib/OpenSSL.pm:588 +msgid "Error converting Certificate" +msgstr "Fel vid konvertering av certifikat" + +#: ../lib/OpenSSL.pm:648 +#: ../lib/OpenSSL.pm:665 +msgid "Error reading fingerprint from Certificate" +msgstr "Fel vid läsning av certfikatets fingeravtryck" + +#: ../lib/OpenSSL.pm:683 +msgid "Error reading subject from Certificate" +msgstr "Fel vid läsning av certifikatets ämnesrad" + +#: ../lib/OpenSSL.pm:693 +msgid "Can't read CRL" +msgstr "Kan inte läsa CRL" + +#: ../lib/OpenSSL.pm:716 +msgid "UNDEFINED" +msgstr "ODEFINIERAD" + +#: ../lib/OpenSSL.pm:743 +#, c-format +msgid "Can't open Request file %s: %s" +msgstr "Kan inte öppna fil för begäran %s: %s" + +#: ../lib/OpenSSL.pm:760 +#: ../lib/OpenSSL.pm:774 +#: ../lib/REQ.pm:652 +msgid "Error converting Request" +msgstr "Fel vid konvertering av begäran" + +#: ../lib/OpenSSL.pm:847 +#, c-format +msgid "Can't open file %s: %s" +msgstr "Kan inte öppna fil %s: %s" + +#: ../lib/OpenSSL.pm:958 +#: ../lib/OpenSSL.pm:990 +#, c-format +msgid "Can't read index %s: %s" +msgstr "Kan inte läsa index %s: %s" + +#: ../lib/OpenSSL.pm:1000 +#, c-format +msgid "Can't write index %s: %s" +msgstr "Kan inte skriva index %s: %s" + +#: ../lib/REQ.pm:59 +#, c-format +msgid "Strange value for 'opts': %s" +msgstr "Konstigt värde för \"opts\": %s" + +#: ../lib/REQ.pm:102 +msgid "Please specify at least Common Name " +msgstr "Vänligen ange åtminstone namn " + +#: ../lib/REQ.pm:103 +msgid "and Password" +msgstr "och lösenord" + +#: ../lib/REQ.pm:246 +#: ../lib/REQ.pm:376 +msgid "Request file not found" +msgstr "Fil med begäran hittades inte" + +#: ../lib/REQ.pm:299 +msgid "Can't open Request directory" +msgstr "Kan inte öppna katalog för begäran" + +#: ../lib/REQ.pm:320 +#, c-format +msgid " Read Request: %s" +msgstr " Läs begäran: %s" + +#: ../lib/REQ.pm:426 +msgid "Can't read serial" +msgstr "Kan inte läsa serienummer" + +#: ../lib/REQ.pm:498 +msgid "" +"Wrong CA password given\n" +"Signing of the Request failed" +msgstr "" +"Fel CA-lösenord angavs\n" +"Signering av begäran misslyckades" + +#: ../lib/REQ.pm:504 +msgid "" +"CA Key not found\n" +"Signing of the Request failed" +msgstr "" +"CA-nyckel hittades inte\n" +"Signering av begäran misslyckades" + +#: ../lib/REQ.pm:510 +msgid "" +"Certificate already existing\n" +"Signing of the Request failed" +msgstr "" +"Certifikatet existerar redan\n" +"Signering av begäran misslyckades" + +#: ../lib/REQ.pm:516 +msgid "" +"Invalid IP Address given\n" +"Signing of the Request failed" +msgstr "" +"Ogiltigt IP-adress angavs\n" +"Signering av begäran misslyckades" + +#: ../lib/REQ.pm:523 +#: ../lib/REQ.pm:541 +msgid "Signing of the Request failed" +msgstr "Signering av begäran misslyckades" + +#: ../lib/REQ.pm:548 +msgid "Can't read Certificate file" +msgstr "Kan inte läsa certifikatfil" + +#: ../lib/REQ.pm:554 +#: ../lib/REQ.pm:564 +msgid "Can't write Certificate file" +msgstr "Kan inte skriva certifikatfil" + +#: ../lib/REQ.pm:576 +msgid "" +"Request signed succesfully.\n" +"Certificate created" +msgstr "" +"Signering av begäran lyckades.\n" +"Certifikat skapat" + +#: ../lib/REQ.pm:617 +msgid "Please select a Request file first" +msgstr "Vänligen välj en fil innehållande en begäran först" + +#: ../lib/REQ.pm:623 +msgid "Can't find Request file: " +msgstr "Kan inte hitta fil med begäran: " + +#: ../lib/REQ.pm:629 +msgid "Can't read Request file:" +msgstr "Kan inte läsa fil med begäran:" + +#: ../lib/REQ.pm:675 +msgid "Parsing Request failed" +msgstr "Tolkning av begäran misslyckades" + +#: ../lib/TCONFIG.pm:43 +msgid "Please select a CA first" +msgstr "Vänligen välj ett CA först" + +#: ../lib/TCONFIG.pm:50 +msgid "Can't open configuration" +msgstr "Kan inte öppna konfiguration" + +#: ../lib/TCONFIG.pm:285 +#: ../lib/TCONFIG.pm:300 +#: ../lib/GUI/TCONFIG.pm:39 +#: ../lib/GUI/TCONFIG.pm:1289 +msgid "Can't get CA name" +msgstr "Kan inte hämta CA-namn" + +#: ../lib/TCONFIG.pm:328 +msgid "Can't open configfile" +msgstr "Kan inte öppna konfigurationsfil" + +#: ../lib/GUI/HELPERS.pm:55 +#: ../lib/GUI/HELPERS.pm:95 +#: ../lib/GUI/HELPERS.pm:136 +msgid "Command Details" +msgstr "Detaljer om kommando" + +#: ../lib/GUI/HELPERS.pm:306 +msgid "Request Files (*.pem, *.der, *.req)" +msgstr "Filer för begäran (*.pem, *.der, *.req)" + +#: ../lib/GUI/HELPERS.pm:313 +msgid "All Files (*.*)" +msgstr "Alla filer (*.*)" + +#: ../lib/GUI/TCONFIG.pm:66 +msgid "" +"All Settings are written unchanged to openssl.conf.\n" +"So please study the documentation of OpenSSL if you don't know exactly what to do.\n" +"If you are still unsure - keep the defaults and everything is expected to work fine." +msgstr "" +"Alla inställningar skrivs som de är till openssl.conf.\n" +"Vänligen läs dokumentationen för OpenSSL om du inte vet exakt vad du ska göra.\n" +"Om du fortfarande är osäker - behåll de förvalda värdena och allt bör fungera som det ska." + +#: ../lib/GUI/TCONFIG.pm:100 +#: ../lib/GUI/TCONFIG.pm:108 +msgid "OpenSSL Configuration" +msgstr "Konfiguration av OpenSSL" + +#: ../lib/GUI/TCONFIG.pm:121 +msgid "Only change these options, if you really know, what you are doing!!" +msgstr "Ändra endast dessa alternativ, om du verkligen vet vad du gör!!" + +#: ../lib/GUI/TCONFIG.pm:129 +msgid "You should be aware, that some options may break some crappy software!!" +msgstr "Du bör känna till att vissa alternativ kan göra sönder viss rutten programvara!!" + +#: ../lib/GUI/TCONFIG.pm:138 +#: ../lib/GUI/TCONFIG.pm:1335 +msgid "If you are unsure: leave the defaults untouched" +msgstr "Om du är osäker: lämna kvar förvalda värden" + +#: ../lib/GUI/TCONFIG.pm:174 +msgid "These Settings are passed to OpenSSL for creating Server Certificates" +msgstr "Dessa inställningar skickas till OpenSSL för att skapa servercertifikat" + +#: ../lib/GUI/TCONFIG.pm:179 +#: ../lib/GUI/TCONFIG.pm:603 +#: ../lib/GUI/TCONFIG.pm:1007 +#: ../lib/GUI/TCONFIG.pm:1227 +#: ../lib/GUI/TCONFIG.pm:1327 +msgid "Multiple Values can be separated by \",\"" +msgstr "Flera värden kan separeras med \",\"" + +#: ../lib/GUI/TCONFIG.pm:199 +#: ../lib/GUI/TCONFIG.pm:201 +msgid "Server Certificate Settings" +msgstr "Inställningar för servercertifikat" + +#: ../lib/GUI/TCONFIG.pm:207 +#: ../lib/GUI/TCONFIG.pm:629 +#: ../lib/GUI/TCONFIG.pm:1035 +#: ../lib/GUI/TCONFIG.pm:1449 +msgid "Subject alternative name (subjectAltName):" +msgstr "Ämne alternativt namn (subjectAltName):" + +#: ../lib/GUI/TCONFIG.pm:304 +#: ../lib/GUI/TCONFIG.pm:735 +#: ../lib/GUI/TCONFIG.pm:1095 +#: ../lib/GUI/TCONFIG.pm:1345 +msgid "Key Usage (keyUsage):" +msgstr "Nyckelanvändning (keyUsage):" + +#: ../lib/GUI/TCONFIG.pm:383 +#: ../lib/GUI/TCONFIG.pm:807 +msgid "Extended Key Usage (extendedKeyUsage):" +msgstr "Utökad nyckelanvändning (extendedKeyUsage):" + +#: ../lib/GUI/TCONFIG.pm:459 +#: ../lib/GUI/TCONFIG.pm:882 +#: ../lib/GUI/TCONFIG.pm:1064 +#: ../lib/GUI/TCONFIG.pm:1418 +msgid "Netscape Certificate Type (nsCertType):" +msgstr "Typ av Netscape-certifikat (nsCertType):" + +#: ../lib/GUI/TCONFIG.pm:487 +msgid "Netscape SSL Server Name (nsSslServerName):" +msgstr "Netscape SSL-servernamn (nsSslServerName):" + +#: ../lib/GUI/TCONFIG.pm:512 +#: ../lib/GUI/TCONFIG.pm:912 +#: ../lib/GUI/TCONFIG.pm:1170 +msgid "Netscape Revocation URL (nsRevocationUrl):" +msgstr "Netscape URL för återkallning (nsRevocationUrl):" + +#: ../lib/GUI/TCONFIG.pm:537 +#: ../lib/GUI/TCONFIG.pm:936 +msgid "Netscape Renewal URL (nsRenewalUrl):" +msgstr "Netscape URL för förnyelse (nsRenewalUrl):" + +#: ../lib/GUI/TCONFIG.pm:598 +msgid "These Settings are passed to OpenSSL for creating Client Certificates" +msgstr "Dessa inställningar skickas till OpenSSL för skapande av klientcertifikat" + +#: ../lib/GUI/TCONFIG.pm:623 +msgid "Client Certificate Settings" +msgstr "Inställningar för klientcertifikat" + +#: ../lib/GUI/TCONFIG.pm:1002 +msgid "These Settings are passed to OpenSSL for creating CA Certificates" +msgstr "Dessa inställningar skickas till OpenSSL för skapande av CA-certifikat" + +#: ../lib/GUI/TCONFIG.pm:1027 +#: ../lib/GUI/TCONFIG.pm:1029 +msgid "CA Certificate Settings" +msgstr "Inställningar för CA-certifikat" + +#: ../lib/GUI/TCONFIG.pm:1222 +msgid "These Settings are passed to OpenSSL for creating Certificate Revocation Lists" +msgstr "Dessa inställningar skickas till OpenSSL för skapande av certifikatspärrlistor" + +#: ../lib/GUI/TCONFIG.pm:1248 +msgid "Revocation List Settings" +msgstr "Inställningar för spärrlista" + +#: ../lib/GUI/TCONFIG.pm:1309 +msgid "CA Configuration" +msgstr "CA-konfiguration" + +#: ../lib/GUI/TCONFIG.pm:1317 +msgid "These Settings are passed to OpenSSL for creating this CA Certificate" +msgstr "Dessa inställningar skickas till OpenSSL för skapande av det här CA-certifikatet" + +#: ../lib/GUI/TCONFIG.pm:1322 +msgid "and the CA Certificates of every SubCA, created with this CA." +msgstr "och CA-certifikaten för varje Under-CA skapas med detta CA." + +#: ../lib/GUI/WORDS.pm:28 +#: ../lib/GUI/WORDS.pm:75 +msgid "Not set" +msgstr "Inte inställd" + +#: ../lib/GUI/WORDS.pm:29 +#: ../lib/GUI/WORDS.pm:76 +msgid "Ask User" +msgstr "Fråga användaren" + +#: ../lib/GUI/WORDS.pm:30 +#: ../lib/GUI/WORDS.pm:77 +msgid "critical" +msgstr "kritisk" + +#: ../lib/GUI/WORDS.pm:31 +#: ../lib/GUI/WORDS.pm:78 +msgid "not critical" +msgstr "inte kritisk" + +#: ../lib/GUI/WORDS.pm:32 +#: ../lib/GUI/WORDS.pm:79 +msgid "Copy Email" +msgstr "Kopiera e-post" + +#: ../lib/GUI/WORDS.pm:33 +#: ../lib/GUI/WORDS.pm:80 +msgid "raw" +msgstr "rå" + +#: ../lib/GUI/WORDS.pm:34 +#: ../lib/GUI/WORDS.pm:81 +msgid "DNS Name" +msgstr "DNS-namn" + +#: ../lib/GUI/WORDS.pm:35 +#: ../lib/GUI/WORDS.pm:83 +msgid "IP Address" +msgstr "IP-adress" + +#: ../lib/GUI/WORDS.pm:36 +#: ../lib/GUI/WORDS.pm:82 +msgid "Email" +msgstr "E-post" + +#: ../lib/GUI/WORDS.pm:37 +#: ../lib/GUI/WORDS.pm:84 +msgid "SSL Server" +msgstr "SSL-server" + +#: ../lib/GUI/WORDS.pm:38 +#: ../lib/GUI/WORDS.pm:85 +msgid "SSL Server, SSL Client" +msgstr "SSL-server, SSL-klient" + +#: ../lib/GUI/WORDS.pm:39 +#: ../lib/GUI/WORDS.pm:86 +msgid "Key Encipherment" +msgstr "Nyckelchiffrering" + +#: ../lib/GUI/WORDS.pm:40 +#: ../lib/GUI/WORDS.pm:87 +msgid "Digital Signature" +msgstr "Digital signatur" + +#: ../lib/GUI/WORDS.pm:41 +#: ../lib/GUI/WORDS.pm:88 +msgid "Key Encipherment, Digital Signature" +msgstr "Nyckelkryptering, Digital signatur" + +#: ../lib/GUI/WORDS.pm:42 +#: ../lib/GUI/WORDS.pm:89 +msgid "Object Signing" +msgstr "Objektsignering" + +#: ../lib/GUI/WORDS.pm:43 +#: ../lib/GUI/WORDS.pm:93 +msgid "SSL Client, Object Signing" +msgstr "SSL-klient, Objektsignering" + +#: ../lib/GUI/WORDS.pm:44 +#: ../lib/GUI/WORDS.pm:91 +msgid "SSL Client, Email(S/MIME)" +msgstr "SSL-klient, E-post(S/MIME)" + +#: ../lib/GUI/WORDS.pm:45 +#: ../lib/GUI/WORDS.pm:92 +msgid "SSL Client" +msgstr "SSL-klient" + +#: ../lib/GUI/WORDS.pm:46 +#: ../lib/GUI/WORDS.pm:90 +msgid "Email(S/MIME)" +msgstr "E-post(S/MIME)" + +#: ../lib/GUI/WORDS.pm:47 +#: ../lib/GUI/WORDS.pm:94 +msgid "SSL Client, Email, Object Signing" +msgstr "SSL-klient, E-post, Objektsignering" + +#: ../lib/GUI/WORDS.pm:48 +#: ../lib/GUI/WORDS.pm:95 +msgid "Object Signing CA" +msgstr "Objektsignering CA" + +#: ../lib/GUI/WORDS.pm:49 +#: ../lib/GUI/WORDS.pm:96 +msgid "S/MIME CA" +msgstr "S/MIME CA" + +#: ../lib/GUI/WORDS.pm:50 +#: ../lib/GUI/WORDS.pm:97 +msgid "SSL CA" +msgstr "SSL CA" + +#: ../lib/GUI/WORDS.pm:51 +#: ../lib/GUI/WORDS.pm:98 +msgid "SSL CA, S/MIME CA" +msgstr "SSL CA, S/MIME CA" + +#: ../lib/GUI/WORDS.pm:52 +#: ../lib/GUI/WORDS.pm:99 +msgid "SSL CA, Object Signing CA" +msgstr "SSL CA, Objektsignering CA" + +#: ../lib/GUI/WORDS.pm:53 +#: ../lib/GUI/WORDS.pm:100 +msgid "S/MIME CA, Object Signing CA" +msgstr "S/MIME CA, Objektsignering CA" + +#: ../lib/GUI/WORDS.pm:54 +#: ../lib/GUI/WORDS.pm:101 +msgid "SSL CA, S/MIME CA, Object Signing CA" +msgstr "SSL CA, S/MIME CA, Objektsignering CA" + +#: ../lib/GUI/WORDS.pm:55 +#: ../lib/GUI/WORDS.pm:102 +msgid "Certificate Signing" +msgstr "Certifikatsignering" + +#: ../lib/GUI/WORDS.pm:56 +#: ../lib/GUI/WORDS.pm:103 +msgid "CRL Signing" +msgstr "CRL-signering" + +#: ../lib/GUI/WORDS.pm:57 +#: ../lib/GUI/WORDS.pm:104 +msgid "Certificate Signing, CRL Signing" +msgstr "Certifikatsignering, CRL-signering" + +#: ../lib/GUI/WORDS.pm:65 +msgid "Creation Date" +msgstr "Skapad datum" + +#: ../lib/GUI/WORDS.pm:68 +msgid "Public Key Algorithm" +msgstr "Algoritm för publik nyckel" + +#: ../lib/GUI/WORDS.pm:69 +msgid "Signature Algorithm" +msgstr "Signaturalgoritm" + +#: ../lib/GUI/WORDS.pm:73 +#: ../lib/GUI/X509_infobox.pm:81 +msgid "Fingerprint (MD5)" +msgstr "Fingeravtryck: (MD5)" + +#: ../lib/GUI/WORDS.pm:74 +#: ../lib/GUI/X509_infobox.pm:90 +msgid "Fingerprint (SHA1)" +msgstr "Fingeravtryck: (SHA1)" + +#: ../lib/GUI/X509_browser.pm:450 +msgid "Certificate Information" +msgstr "Certifikatinformation" + +#: ../lib/GUI/X509_browser.pm:454 +msgid "Request Information" +msgstr "Information om begäran" + +#: ../lib/GUI/X509_browser.pm:573 +msgid "Invalid browser mode for selection_fname():" +msgstr "Ogiltigt bläddringsläge för selection_fname():" + +#: ../lib/GUI/X509_browser.pm:573 +#: ../lib/GUI/X509_browser.pm:609 +#: ../lib/GUI/X509_browser.pm:658 +#: ../lib/GUI/X509_browser.pm:679 +#: ../lib/GUI/X509_browser.pm:700 +#: ../lib/GUI/X509_browser.pm:727 +msgid " " +msgstr " " + +#: ../lib/GUI/X509_browser.pm:609 +msgid "Invalid browser mode for selection_dn():" +msgstr "Ogiltigt bläddringsläge för selection_dn():" + +#: ../lib/GUI/X509_browser.pm:658 +#: ../lib/GUI/X509_browser.pm:679 +msgid "Invalid browser mode for selection_cn():" +msgstr "Ogiltigt bläddringsläge för selection_cn():" + +#: ../lib/GUI/X509_browser.pm:700 +msgid "Invalid browser mode for selection_status():" +msgstr "Ogiltigt bläddringsläge för selection_status():" + +#: ../lib/GUI/X509_browser.pm:727 +msgid "Invalid browser mode for selection_type():" +msgstr "Ogiltigt bläddringsläge för selection_type():" + +#: ../tinyca2:59 +#, c-format +msgid "Can't execute %s.\n" +msgstr "Kan inte köra %s.\n" + +#: ../tinyca2:60 +msgid "Configure correct path to openssl in tinyca.\n" +msgstr "Konfigurera korrekt sökväg till openssl i tinyca.\n" + +#: ../tinyca2:65 +msgid "zip command not found, support disabled.\n" +msgstr "zip-kommando hittades inte, zip avstängd.\n" + +#: ../tinyca2:66 +msgid "Configure correct path to zip in tinyca.\n" +msgstr "Konfigurera korrekt sökväg till zip i tinyca.\n" + +#: ../tinyca2:73 +msgid "Can't find templatedir.\n" +msgstr "Kan inte hitta mallkatalog.\n" + +#: ../tinyca2:74 +msgid "Please configure correct path with templates in tinyca.\n" +msgstr "Vänligen konfigurera korrekt sökväg till mallarna i tinyca.\n" + diff --git a/po/tinyca2.pot b/po/tinyca2.pot new file mode 100644 index 0000000..caf7a09 --- /dev/null +++ b/po/tinyca2.pot @@ -0,0 +1,1918 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-07-14 00:27+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../lib/CA.pm:44 +msgid "error: can't open basedir: " +msgstr "" + +#: ../lib/CA.pm:102 +msgid " Opening CA: " +msgstr "" + +#: ../lib/CA.pm:109 ../lib/CA.pm:270 +msgid "Invalid CA selected" +msgstr "" + +#: ../lib/CA.pm:154 +msgid " Initializing OpenSSL" +msgstr "" + +#: ../lib/CA.pm:160 +msgid " Check for CA Version" +msgstr "" + +#: ../lib/CA.pm:167 ../lib/CA.pm:195 +msgid "Can't open index file: " +msgstr "" + +#: ../lib/CA.pm:182 +msgid " Convert CA" +msgstr "" + +#: ../lib/CA.pm:201 +msgid "Can't open index backup: " +msgstr "" + +#: ../lib/CA.pm:218 +msgid "This CA is converted for openssl 0.9.7x now." +msgstr "" + +#: ../lib/CA.pm:220 +msgid "You will find a backup copy of the index file at: " +msgstr "" + +#: ../lib/CA.pm:229 +msgid " Read Configuration" +msgstr "" + +#: ../lib/CA.pm:235 +msgid " Create GUI" +msgstr "" + +#: ../lib/CA.pm:241 +msgid " Create Toolbar" +msgstr "" + +#: ../lib/CA.pm:247 +msgid " Actual CA: " +msgstr "" + +#: ../lib/CA.pm:332 +#, c-format +msgid "CA: %s deleted" +msgstr "" + +#: ../lib/CA.pm:386 +msgid "Password of parent CA is needed for creating a Sub CA" +msgstr "" + +#: ../lib/CA.pm:395 +msgid "Name must be filled in and must" +msgstr "" + +#: ../lib/CA.pm:396 +msgid " not contain Spaces" +msgstr "" + +#: ../lib/CA.pm:408 +msgid "Please specify at least Common Name, " +msgstr "" + +#: ../lib/CA.pm:409 +msgid "Country and Password" +msgstr "" + +#: ../lib/CA.pm:416 ../lib/REQ.pm:109 +msgid "Passwords don't match" +msgstr "" + +#: ../lib/CA.pm:424 ../lib/REQ.pm:120 +msgid "Country must be exact 2 letter code" +msgstr "" + +#: ../lib/CA.pm:428 +#, c-format +msgid "CA: %s already exists" +msgstr "" + +#: ../lib/CA.pm:468 +msgid "Name for storage must be filled in and must not contain spaces" +msgstr "" + +#: ../lib/CA.pm:477 +msgid "You didn't give a password for the private CA key." +msgstr "" + +#: ../lib/CA.pm:479 +msgid "The import will fail, if the key is encrypted." +msgstr "" + +#: ../lib/CA.pm:488 +msgid "Please give a new password for the CA" +msgstr "" + +#: ../lib/CA.pm:495 +msgid "New passwords don't match" +msgstr "" + +#: ../lib/CA.pm:503 +msgid "Please give a CA certificate to import" +msgstr "" + +#: ../lib/CA.pm:508 +#, c-format +msgid "" +"Can't read CA certificate file:\n" +"%s" +msgstr "" + +#: ../lib/CA.pm:518 +msgid "Please give a CA keyfile to import" +msgstr "" + +#: ../lib/CA.pm:523 +#, c-format +msgid "" +"Can't read CA key file:\n" +"%s" +msgstr "" + +#: ../lib/CA.pm:535 +msgid "Please give an Index file to import.\n" +msgstr "" + +#: ../lib/CA.pm:536 +msgid "If you don't have an Index file, i'll try to generate one.\n" +msgstr "" + +#: ../lib/CA.pm:537 +msgid "Attention: This will cause all Certificates to show up as valid.\n" +msgstr "" + +#: ../lib/CA.pm:538 +msgid "Attention: Revoked Certificates will not be determined." +msgstr "" + +#: ../lib/CA.pm:549 +#, c-format +msgid "" +"Can't read Index file:\n" +"%s" +msgstr "" + +#: ../lib/CA.pm:562 +msgid "Please give a directory containing the certificates to import" +msgstr "" + +#: ../lib/CA.pm:567 +#, c-format +msgid "" +"Can't find certificate directory:\n" +"%s" +msgstr "" + +#: ../lib/CA.pm:578 +#, c-format +msgid "CA: %s already exists. Please choose another name" +msgstr "" + +#: ../lib/CA.pm:594 +msgid "Can't find X509v3 Basic Constraints in CA Certificate\n" +msgstr "" + +#: ../lib/CA.pm:595 +msgid "Import canceled" +msgstr "" + +#: ../lib/CA.pm:601 +msgid "The selected CA Certificate is no valid CA certificate\n" +msgstr "" + +#: ../lib/CA.pm:602 +#, c-format +msgid "X509v3 Basic Constraint is set to: %s" +msgstr "" + +#: ../lib/CA.pm:612 +#, c-format +msgid "" +"Can't open Index file:\n" +"%s" +msgstr "" + +#: ../lib/CA.pm:665 ../lib/CERT.pm:61 +#, c-format +msgid "Can't open Certificate directory: %s" +msgstr "" + +#: ../lib/CA.pm:684 ../lib/CERT.pm:84 +#, c-format +msgid " Read Certificate: %s" +msgstr "" + +#: ../lib/CA.pm:694 +#, c-format +msgid "Can't read Certificate file: %s" +msgstr "" + +#: ../lib/CA.pm:718 +#, c-format +msgid "Can't write Certificate file: %s" +msgstr "" + +#: ../lib/CA.pm:768 ../lib/CA.pm:927 +msgid "Can't open Index file: " +msgstr "" + +#: ../lib/CA.pm:780 +#, c-format +msgid "Can't write CA Certificate file: %s" +msgstr "" + +#: ../lib/CA.pm:800 ../lib/CA.pm:934 +msgid "Can't write Serial file: " +msgstr "" + +#: ../lib/CA.pm:814 +#, c-format +msgid "Can't write CA Key file: %s" +msgstr "" + +#: ../lib/CA.pm:831 ../lib/CA.pm:1155 +msgid "Generating CRL failed" +msgstr "" + +#: ../lib/CA.pm:844 +#, c-format +msgid "Succesfully imported %d certificates\n" +msgstr "" + +#: ../lib/CA.pm:845 +msgid "Check the configuration of your imported CA." +msgstr "" + +#: ../lib/CA.pm:862 ../lib/CA.pm:971 +msgid "No CA name given" +msgstr "" + +#: ../lib/CA.pm:871 ../lib/CA.pm:876 ../lib/CA.pm:881 ../lib/CA.pm:886 +#: ../lib/CA.pm:891 ../lib/CA.pm:896 +msgid "Can't create directory: " +msgstr "" + +#: ../lib/CA.pm:905 +#, c-format +msgid "Can't open template file %s %s" +msgstr "" + +#: ../lib/CA.pm:910 ../lib/CA.pm:1207 ../lib/CA.pm:1274 ../lib/CERT.pm:637 +#: ../lib/KEY.pm:227 ../lib/REQ.pm:740 +#, c-format +msgid "Can't open output file: %s: %s" +msgstr "" + +#: ../lib/CA.pm:984 ../lib/KEY.pm:482 ../lib/REQ.pm:167 +msgid "Generating key failed" +msgstr "" + +#: ../lib/CA.pm:1018 ../lib/REQ.pm:193 +msgid "Generating Request failed" +msgstr "" + +#: ../lib/CA.pm:1027 ../lib/CA.pm:1041 ../lib/CERT.pm:102 +msgid "Can't read Certificate" +msgstr "" + +#: ../lib/CA.pm:1032 ../lib/CA.pm:1046 +msgid "Can't write Certificate" +msgstr "" + +#: ../lib/CA.pm:1086 +msgid "Generating certificate failed" +msgstr "" + +#: ../lib/CA.pm:1106 ../lib/CA.pm:1131 +#, c-format +msgid "Can't open ca certificate file %s %s" +msgstr "" + +#: ../lib/CA.pm:1115 +#, c-format +msgid "Can't create certificate chain file: %s: %s" +msgstr "" + +#: ../lib/CA.pm:1164 +#, c-format +msgid "CA: %s created" +msgstr "" + +#: ../lib/CA.pm:1199 +#, c-format +msgid "Can't open certificate chain file: %s: %s" +msgstr "" + +#: ../lib/CA.pm:1220 +#, c-format +msgid "Certificate Chain succesfully exported to: %s" +msgstr "" + +#: ../lib/CA.pm:1255 ../lib/CERT.pm:580 ../lib/GUI.pm:166 ../lib/KEY.pm:348 +#: ../lib/REQ.pm:71 ../lib/REQ.pm:389 +msgid "Can't read CA certificate" +msgstr "" + +#: ../lib/CA.pm:1265 +#, c-format +msgid "Invalid Format for export_ca_cert(): %s" +msgstr "" + +#: ../lib/CA.pm:1287 +#, c-format +msgid "Certificate succesfully exported to: %s" +msgstr "" + +#: ../lib/CA.pm:1320 +msgid "Please give the output file" +msgstr "" + +#: ../lib/CA.pm:1328 +msgid "Please give the CA password to create the Revocation List" +msgstr "" + +#: ../lib/CA.pm:1349 +msgid "" +"Wrong CA password given\n" +"Generating Revocation List failed" +msgstr "" + +#: ../lib/CA.pm:1353 +msgid "" +"CA Key not found\n" +"Generating Revocation List failed" +msgstr "" + +#: ../lib/CA.pm:1357 ../lib/CA.pm:1363 +msgid "Generating Revocation List failed" +msgstr "" + +#: ../lib/CA.pm:1371 +#, c-format +msgid "CRL successfully exported to: %s" +msgstr "" + +#: ../lib/CERT.pm:143 ../lib/CERT.pm:199 ../lib/CERT.pm:322 ../lib/CERT.pm:381 +#: ../lib/GUI.pm:851 +msgid "Please select a Certificate first" +msgstr "" + +#: ../lib/CERT.pm:151 ../lib/CERT.pm:209 ../lib/CERT.pm:333 ../lib/CERT.pm:400 +#: ../lib/GUI.pm:2706 ../lib/GUI.pm:2717 ../lib/OpenSSL.pm:702 +#: ../lib/GUI/X509_browser.pm:276 +msgid "VALID" +msgstr "" + +#: ../lib/CERT.pm:153 +#, c-format +msgid "" +"Can't renew Certifikate with Status: %s\n" +"Please revoke the Certificate first" +msgstr "" + +#: ../lib/CERT.pm:168 +msgid "" +"Key and Request are necessary for renewal of a Certificate\n" +"Renewal is not possible!" +msgstr "" + +#: ../lib/CERT.pm:210 +#, c-format +msgid "Can't revoke Certifikate with Status: %s" +msgstr "" + +#: ../lib/CERT.pm:256 +msgid "" +"Wrong CA password given\n" +"Revoking the Certificate failed" +msgstr "" + +#: ../lib/CERT.pm:263 +msgid "" +"CA Key not found\n" +"Revoking the Certificate failed" +msgstr "" + +#: ../lib/CERT.pm:270 +msgid "Revoking the Certificate failed" +msgstr "" + +#: ../lib/CERT.pm:290 +msgid "Generating a new Revocation List failed" +msgstr "" + +#: ../lib/CERT.pm:335 +msgid "" +"Can't delete VALID certificate!\n" +"Please revoke the Certificate first." +msgstr "" + +#: ../lib/CERT.pm:401 +msgid "Certificate seems not to be VALID" +msgstr "" + +#: ../lib/CERT.pm:403 +msgid "Export is not possible" +msgstr "" + +#: ../lib/CERT.pm:430 ../lib/KEY.pm:172 +msgid "Please give at least the output file" +msgstr "" + +#: ../lib/CERT.pm:436 +msgid "Key is necessary for export as PKCS#12" +msgstr "" + +#: ../lib/CERT.pm:438 ../lib/CERT.pm:454 ../lib/KEY.pm:257 ../lib/KEY.pm:308 +msgid "Export is not possible!" +msgstr "" + +#: ../lib/CERT.pm:452 +#, c-format +msgid "Key is necessary for export as %s" +msgstr "" + +#: ../lib/CERT.pm:492 ../lib/KEY.pm:216 +#, c-format +msgid "Can't open Certificate file: %s: %s" +msgstr "" + +#: ../lib/CERT.pm:525 ../lib/KEY.pm:288 +msgid "Generating PKCS#12 failed" +msgstr "" + +#: ../lib/CERT.pm:533 ../lib/CERT.pm:616 ../lib/KEY.pm:295 ../lib/KEY.pm:381 +#, c-format +msgid "Certificate and Key successfully exported to %s" +msgstr "" + +#: ../lib/CERT.pm:546 ../lib/CERT.pm:567 ../lib/REQ.pm:693 +#, c-format +msgid "Can't create temporary file: %s: %s" +msgstr "" + +#: ../lib/CERT.pm:558 +#, c-format +msgid "Can't read Key file: %s: %s" +msgstr "" + +#: ../lib/CERT.pm:588 ../lib/KEY.pm:321 ../lib/KEY.pm:337 ../lib/KEY.pm:355 +msgid "Can't create temporary file" +msgstr "" + +#: ../lib/CERT.pm:609 ../lib/KEY.pm:375 +#, c-format +msgid "Generating %s file failed" +msgstr "" + +#: ../lib/CERT.pm:628 +#, c-format +msgid "Invalid Format for export_cert(): %s" +msgstr "" + +#: ../lib/CERT.pm:648 +#, c-format +msgid "Certificate successfully exported to: %s" +msgstr "" + +#: ../lib/GUI.pm:171 ../lib/GUI.pm:178 +msgid "CA" +msgstr "" + +#: ../lib/GUI.pm:185 +msgid "CA Information" +msgstr "" + +#: ../lib/GUI.pm:204 +msgid "Certificates" +msgstr "" + +#: ../lib/GUI.pm:244 ../lib/GUI.pm:2689 ../lib/GUI/WORDS.pm:56 +#: ../lib/GUI/X509_browser.pm:160 ../lib/GUI/X509_browser.pm:168 +#: ../lib/GUI/X509_browser.pm:177 +msgid "Common Name" +msgstr "" + +#: ../lib/GUI.pm:245 ../lib/GUI.pm:1273 ../lib/GUI.pm:2314 +#: ../lib/GUI/WORDS.pm:57 ../lib/GUI/X509_browser.pm:161 +#: ../lib/GUI/X509_browser.pm:169 ../lib/GUI/X509_browser.pm:178 +msgid "eMail Address" +msgstr "" + +#: ../lib/GUI.pm:246 ../lib/GUI/WORDS.pm:59 ../lib/GUI/X509_browser.pm:162 +#: ../lib/GUI/X509_browser.pm:170 ../lib/GUI/X509_browser.pm:179 +msgid "Organizational Unit" +msgstr "" + +#: ../lib/GUI.pm:247 ../lib/GUI/WORDS.pm:58 ../lib/GUI/X509_browser.pm:163 +#: ../lib/GUI/X509_browser.pm:171 ../lib/GUI/X509_browser.pm:180 +msgid "Organization" +msgstr "" + +#: ../lib/GUI.pm:248 ../lib/GUI/WORDS.pm:60 ../lib/GUI/X509_browser.pm:164 +#: ../lib/GUI/X509_browser.pm:172 ../lib/GUI/X509_browser.pm:181 +msgid "Location" +msgstr "" + +#: ../lib/GUI.pm:249 ../lib/GUI/WORDS.pm:61 ../lib/GUI/X509_browser.pm:165 +#: ../lib/GUI/X509_browser.pm:173 ../lib/GUI/X509_browser.pm:182 +msgid "State" +msgstr "" + +#: ../lib/GUI.pm:250 ../lib/GUI/WORDS.pm:62 ../lib/GUI/X509_browser.pm:166 +#: ../lib/GUI/X509_browser.pm:174 ../lib/GUI/X509_browser.pm:183 +msgid "Country" +msgstr "" + +#: ../lib/GUI.pm:251 ../lib/GUI/WORDS.pm:68 ../lib/GUI/X509_browser.pm:184 +msgid "Type" +msgstr "" + +#: ../lib/GUI.pm:265 +msgid "Keys" +msgstr "" + +#: ../lib/GUI.pm:308 +msgid "Requests" +msgstr "" + +#: ../lib/GUI.pm:399 +#, c-format +msgid " Actual CA: %s" +msgstr "" + +#: ../lib/GUI.pm:402 +#, c-format +msgid " Actual CA: %s - Certificates" +msgstr "" + +#: ../lib/GUI.pm:405 +#, c-format +msgid " Actual CA: %s - Keys" +msgstr "" + +#: ../lib/GUI.pm:408 +#, c-format +msgid " Actual CA: %s - Requests" +msgstr "" + +#: ../lib/GUI.pm:457 ../lib/GUI.pm:1141 +msgid "Open CA" +msgstr "" + +#: ../lib/GUI.pm:463 +msgid "New CA" +msgstr "" + +#: ../lib/GUI.pm:469 ../lib/GUI.pm:2382 +msgid "Import CA" +msgstr "" + +#: ../lib/GUI.pm:475 ../lib/GUI.pm:1143 +msgid "Delete CA" +msgstr "" + +#: ../lib/GUI.pm:485 ../lib/GUI.pm:524 ../lib/GUI.pm:592 +msgid "Details" +msgstr "" + +#: ../lib/GUI.pm:491 +msgid "History" +msgstr "" + +#: ../lib/GUI.pm:497 +msgid "Sub CA" +msgstr "" + +#: ../lib/GUI.pm:503 +msgid "Export CA" +msgstr "" + +#: ../lib/GUI.pm:509 ../lib/GUI.pm:1419 +msgid "Export CRL" +msgstr "" + +#: ../lib/GUI.pm:516 +msgid "Export Chain" +msgstr "" + +#: ../lib/GUI.pm:530 ../lib/GUI.pm:598 +msgid "View" +msgstr "" + +#: ../lib/GUI.pm:540 ../lib/GUI.pm:604 +msgid "New" +msgstr "" + +#: ../lib/GUI.pm:547 ../lib/GUI.pm:578 +msgid "Export" +msgstr "" + +#: ../lib/GUI.pm:553 +msgid "Revoke" +msgstr "" + +#: ../lib/GUI.pm:563 +msgid "Renew" +msgstr "" + +#: ../lib/GUI.pm:570 ../lib/GUI.pm:584 ../lib/GUI.pm:627 +msgid "Delete" +msgstr "" + +#: ../lib/GUI.pm:610 +msgid "Import" +msgstr "" + +#: ../lib/GUI.pm:620 +msgid "Sign" +msgstr "" + +#: ../lib/GUI.pm:646 +msgid "_CA" +msgstr "" + +#: ../lib/GUI.pm:649 +msgid "_Open CA" +msgstr "" + +#: ../lib/GUI.pm:654 +msgid "_New CA" +msgstr "" + +#: ../lib/GUI.pm:659 +msgid "_Delete CA" +msgstr "" + +#: ../lib/GUI.pm:667 +msgid "_Exit" +msgstr "" + +#: ../lib/GUI.pm:674 +msgid "_Preferences" +msgstr "" + +#: ../lib/GUI.pm:677 +msgid "Experts Only!!" +msgstr "" + +#: ../lib/GUI.pm:682 +msgid "OpenSSL _Configuration" +msgstr "" + +#: ../lib/GUI.pm:689 ../lib/GUI.pm:692 +msgid "_Help" +msgstr "" + +#: ../lib/GUI.pm:697 +msgid "_About TinyCA" +msgstr "" + +#: ../lib/GUI.pm:728 +msgid "Invalid mode for show_text():" +msgstr "" + +#: ../lib/GUI.pm:733 ../lib/GUI.pm:848 ../lib/REQ.pm:236 ../lib/REQ.pm:367 +msgid "Please select a Request first" +msgstr "" + +#: ../lib/GUI.pm:736 +msgid "Please select a certificate first" +msgstr "" + +#: ../lib/GUI.pm:752 ../lib/GUI.pm:867 ../lib/GUI/X509_browser.pm:456 +#: ../lib/GUI/X509_browser.pm:515 +msgid "Can't read file" +msgstr "" + +#: ../lib/GUI.pm:754 +msgid "Request" +msgstr "" + +#: ../lib/GUI.pm:754 +msgid "Certificate" +msgstr "" + +#: ../lib/GUI.pm:815 +#, c-format +msgid "Invalid mode for _show_popup_menu(): %s" +msgstr "" + +#: ../lib/GUI.pm:843 +msgid "Invalid mode for show_details():" +msgstr "" + +#: ../lib/GUI.pm:869 ../lib/GUI.pm:969 ../lib/GUI.pm:3040 +msgid "Request Details" +msgstr "" + +#: ../lib/GUI.pm:869 ../lib/GUI.pm:969 ../lib/GUI.pm:2897 +msgid "Certificate Details" +msgstr "" + +#: ../lib/GUI.pm:911 ../lib/GUI.pm:1679 ../lib/GUI.pm:3061 +msgid "Import Request" +msgstr "" + +#: ../lib/GUI.pm:913 ../lib/GUI.pm:2438 +msgid "Import CA Certificate" +msgstr "" + +#: ../lib/GUI.pm:921 +msgid "Do you want to import the following Certificate Request?" +msgstr "" + +#: ../lib/GUI.pm:923 +msgid "Do you want to import the following CA Certificate?" +msgstr "" + +#: ../lib/GUI.pm:977 +msgid "Subject DN" +msgstr "" + +#: ../lib/GUI.pm:1001 +msgid "Issuer" +msgstr "" + +#: ../lib/GUI.pm:1027 +msgid "Validity" +msgstr "" + +#: ../lib/GUI.pm:1043 +msgid "Key/Request Details:" +msgstr "" + +#: ../lib/GUI.pm:1043 +msgid "Key/Certificate Details:" +msgstr "" + +#: ../lib/GUI.pm:1059 +msgid "Fingerprints" +msgstr "" + +#: ../lib/GUI.pm:1075 +msgid "Requested X.509 Extensions" +msgstr "" + +#: ../lib/GUI.pm:1075 +msgid "X.509v3 Extensions" +msgstr "" + +#: ../lib/GUI.pm:1100 +msgid "Requested Netscape Extensions" +msgstr "" + +#: ../lib/GUI.pm:1100 +msgid "Netscape Extensions" +msgstr "" + +#: ../lib/GUI.pm:1145 +msgid "Invalid action given: " +msgstr "" + +#: ../lib/GUI.pm:1167 ../lib/GUI.pm:1213 +msgid "Invalid action for show_select_ca_dialog(): " +msgstr "" + +#: ../lib/GUI.pm:1189 +msgid "Available CAs" +msgstr "" + +#: ../lib/GUI.pm:1245 +msgid "Create Request" +msgstr "" + +#: ../lib/GUI.pm:1246 +msgid "Create a new Certificate Request" +msgstr "" + +#: ../lib/GUI.pm:1260 +msgid "Common Name (eg, your Name," +msgstr "" + +#: ../lib/GUI.pm:1265 +msgid "your eMail Address" +msgstr "" + +#: ../lib/GUI.pm:1269 +msgid "or the Servers Name)" +msgstr "" + +#: ../lib/GUI.pm:1277 +msgid "Password (protect your private Key):" +msgstr "" + +#: ../lib/GUI.pm:1281 ../lib/GUI.pm:2294 +msgid "Password (confirmation):" +msgstr "" + +#: ../lib/GUI.pm:1285 ../lib/GUI.pm:2286 +msgid "Country Name (2 letter code):" +msgstr "" + +#: ../lib/GUI.pm:1289 ../lib/GUI.pm:2298 +msgid "State or Province Name:" +msgstr "" + +#: ../lib/GUI.pm:1293 ../lib/GUI.pm:2302 +msgid "Locality Name (eg. city):" +msgstr "" + +#: ../lib/GUI.pm:1297 ../lib/GUI.pm:2306 +msgid "Organization Name (eg. company):" +msgstr "" + +#: ../lib/GUI.pm:1303 ../lib/GUI.pm:1308 ../lib/GUI.pm:2310 +msgid "Organizational Unit Name (eg. section):" +msgstr "" + +#: ../lib/GUI.pm:1313 ../lib/GUI.pm:2322 ../lib/GUI/WORDS.pm:65 +msgid "Keylength" +msgstr "" + +#: ../lib/GUI.pm:1321 ../lib/GUI.pm:2352 +msgid "Digest" +msgstr "" + +#: ../lib/GUI.pm:1328 +msgid "Algorithm" +msgstr "" + +#: ../lib/GUI.pm:1359 ../lib/GUI.pm:2918 +msgid "Revoke Certificate" +msgstr "" + +#: ../lib/GUI.pm:1368 ../lib/GUI.pm:1444 ../lib/GUI.pm:2093 +msgid "CA Password:" +msgstr "" + +#: ../lib/GUI.pm:1374 +msgid "Revocation Reason:" +msgstr "" + +#: ../lib/GUI.pm:1419 +msgid "Export Revocation List to File" +msgstr "" + +#: ../lib/GUI.pm:1427 ../lib/GUI.pm:1515 ../lib/GUI.pm:1563 ../lib/GUI.pm:1687 +#: ../lib/GUI.pm:1755 +msgid "File:" +msgstr "" + +#: ../lib/GUI.pm:1438 ../lib/GUI.pm:1526 ../lib/GUI.pm:1574 ../lib/GUI.pm:1697 +#: ../lib/GUI.pm:1772 ../lib/GUI.pm:2435 ../lib/GUI.pm:2454 ../lib/GUI.pm:2473 +#: ../lib/GUI.pm:2492 +msgid "Browse..." +msgstr "" + +#: ../lib/GUI.pm:1441 ../lib/GUI.pm:1554 ../lib/GUI.pm:1577 +msgid "Export CA Certificate" +msgstr "" + +#: ../lib/GUI.pm:1448 ../lib/GUI.pm:2099 ../lib/GUI.pm:2318 +msgid "Valid for (Days):" +msgstr "" + +#: ../lib/GUI.pm:1452 ../lib/GUI.pm:1581 ../lib/GUI.pm:1779 +msgid "Export Format:" +msgstr "" + +#: ../lib/GUI.pm:1458 ../lib/GUI.pm:1587 +msgid "PEM" +msgstr "" + +#: ../lib/GUI.pm:1467 ../lib/GUI.pm:1596 +msgid "DER" +msgstr "" + +#: ../lib/GUI.pm:1476 ../lib/GUI.pm:1605 +msgid "TXT" +msgstr "" + +#: ../lib/GUI.pm:1507 ../lib/GUI.pm:1529 +msgid "Export CA Certificate Chain" +msgstr "" + +#: ../lib/GUI.pm:1508 +msgid "Export CA Certificate Chain to File" +msgstr "" + +#: ../lib/GUI.pm:1555 +msgid "Export CA Certificate to File" +msgstr "" + +#: ../lib/GUI.pm:1635 ../lib/GUI.pm:1636 +msgid "Export Key without Passphrase" +msgstr "" + +#: ../lib/GUI.pm:1640 +msgid "I hope you know what you're doing?" +msgstr "" + +#: ../lib/GUI.pm:1644 +msgid "The Key Passphrase is needed for decryption of the Key" +msgstr "" + +#: ../lib/GUI.pm:1653 +msgid "Password:" +msgstr "" + +#: ../lib/GUI.pm:1679 ../lib/GUI.pm:1700 +msgid "Import Request from File" +msgstr "" + +#: ../lib/GUI.pm:1721 ../lib/GUI.pm:1759 ../lib/GUI.pm:2911 +msgid "Export Certificate" +msgstr "" + +#: ../lib/GUI.pm:1723 ../lib/GUI.pm:1761 ../lib/GUI.pm:2868 +msgid "Export Key" +msgstr "" + +#: ../lib/GUI.pm:1726 +msgid "Invalid mode for show_export_dialog(): " +msgstr "" + +#: ../lib/GUI.pm:1743 +msgid "Export Certificate to File" +msgstr "" + +#: ../lib/GUI.pm:1745 +msgid "Export Key to File" +msgstr "" + +#: ../lib/GUI.pm:1783 +msgid "PEM (Certificate)" +msgstr "" + +#: ../lib/GUI.pm:1785 +msgid "PEM (Key)" +msgstr "" + +#: ../lib/GUI.pm:1794 +msgid "DER (Certificate)" +msgstr "" + +#: ../lib/GUI.pm:1796 +msgid "DER (Key without Passphrase)" +msgstr "" + +#: ../lib/GUI.pm:1804 +msgid "PKCS#12 (Certificate & Key)" +msgstr "" + +#: ../lib/GUI.pm:1811 +msgid "Zip (Certificate & Key)" +msgstr "" + +#: ../lib/GUI.pm:1821 +msgid "Tar (Certificate & Key)" +msgstr "" + +#: ../lib/GUI.pm:1833 +msgid "TXT (Certificate)" +msgstr "" + +#: ../lib/GUI.pm:1839 +msgid "Without Passphrase (PEM/PKCS#12)" +msgstr "" + +#: ../lib/GUI.pm:1845 ../lib/GUI.pm:1872 ../lib/GUI.pm:1891 ../lib/GUI.pm:2018 +#: ../lib/GUI.pm:2043 ../lib/GUI.pm:2196 +msgid "Yes" +msgstr "" + +#: ../lib/GUI.pm:1850 ../lib/GUI.pm:1877 ../lib/GUI.pm:1896 ../lib/GUI.pm:2024 +#: ../lib/GUI.pm:2049 ../lib/GUI.pm:2202 +msgid "No" +msgstr "" + +#: ../lib/GUI.pm:1860 +msgid "Include Key (PEM)" +msgstr "" + +#: ../lib/GUI.pm:1865 +msgid "Include Certificate (PEM)" +msgstr "" + +#: ../lib/GUI.pm:1885 +msgid "Include Fingerprint (PEM)" +msgstr "" + +#: ../lib/GUI.pm:1993 ../lib/GUI.pm:1994 +msgid "Export to PKCS#12" +msgstr "" + +#: ../lib/GUI.pm:2001 +msgid "Key Password:" +msgstr "" + +#: ../lib/GUI.pm:2005 +msgid "Export Password:" +msgstr "" + +#: ../lib/GUI.pm:2008 +msgid "Friendly Name:" +msgstr "" + +#: ../lib/GUI.pm:2012 +msgid "Without Passphrase" +msgstr "" + +#: ../lib/GUI.pm:2037 +msgid "Add CA Certificate to PKCS#12 structure" +msgstr "" + +#: ../lib/GUI.pm:2085 ../lib/GUI.pm:3068 +msgid "Sign Request" +msgstr "" + +#: ../lib/GUI.pm:2085 +msgid "Sign Request/Create Certificate" +msgstr "" + +#: ../lib/GUI.pm:2110 ../lib/GUI.pm:2155 +msgid "Subject alternative name (IP Address):" +msgstr "" + +#: ../lib/GUI.pm:2113 ../lib/GUI.pm:2158 +msgid "Subject alternative name (DNS Name):" +msgstr "" + +#: ../lib/GUI.pm:2116 ../lib/GUI.pm:2164 +msgid "Subject alternative name (raw):" +msgstr "" + +#: ../lib/GUI.pm:2124 ../lib/GUI.pm:2172 +msgid "Extended Key Usage:" +msgstr "" + +#: ../lib/GUI.pm:2131 +msgid "Netscape SSL Server Name:" +msgstr "" + +#: ../lib/GUI.pm:2138 ../lib/GUI.pm:2179 +msgid "Netscape Revocation URL:" +msgstr "" + +#: ../lib/GUI.pm:2145 ../lib/GUI.pm:2186 +msgid "Netscape Renewal URL:" +msgstr "" + +#: ../lib/GUI.pm:2161 +msgid "Subject alternative name (eMail Address):" +msgstr "" + +#: ../lib/GUI.pm:2208 +msgid "Add eMail Address to Subject DN:" +msgstr "" + +#: ../lib/GUI.pm:2238 ../lib/GUI.pm:2242 +msgid "Create CA" +msgstr "" + +#: ../lib/GUI.pm:2238 +msgid "Create a new Sub CA" +msgstr "" + +#: ../lib/GUI.pm:2242 +msgid "Create a new CA" +msgstr "" + +#: ../lib/GUI.pm:2255 +msgid "CA Password (for creating the new CA):" +msgstr "" + +#: ../lib/GUI.pm:2266 ../lib/GUI.pm:2403 +msgid "Name (for local storage):" +msgstr "" + +#: ../lib/GUI.pm:2273 +msgid "Data for CA Certificate" +msgstr "" + +#: ../lib/GUI.pm:2282 +msgid "Common Name (for the CA):" +msgstr "" + +#: ../lib/GUI.pm:2290 +msgid "Password (needed for signing):" +msgstr "" + +#: ../lib/GUI.pm:2382 +msgid "Import an existing CA into TinyCA" +msgstr "" + +#: ../lib/GUI.pm:2393 +msgid "Password of the private CA key (Needed for import):" +msgstr "" + +#: ../lib/GUI.pm:2407 +msgid "New password for the CA:" +msgstr "" + +#: ../lib/GUI.pm:2411 +msgid "Confirm password:" +msgstr "" + +#: ../lib/GUI.pm:2416 +msgid "Files/Directories to import" +msgstr "" + +#: ../lib/GUI.pm:2424 +msgid "CA Certificate (PEM/DER):" +msgstr "" + +#: ../lib/GUI.pm:2443 +msgid "CA private key (PEM/DER):" +msgstr "" + +#: ../lib/GUI.pm:2457 +msgid "Import CA private Key" +msgstr "" + +#: ../lib/GUI.pm:2462 +msgid "OpenSSL Index File (index.txt):" +msgstr "" + +#: ../lib/GUI.pm:2476 +msgid "Import Index File" +msgstr "" + +#: ../lib/GUI.pm:2481 +msgid "Directory containing certificates (PEM/DER):" +msgstr "" + +#: ../lib/GUI.pm:2495 +msgid "Import Certificates from directory" +msgstr "" + +#: ../lib/GUI.pm:2509 +msgid "You are kidding, are you??" +msgstr "" + +#: ../lib/GUI.pm:2531 +msgid "Spanish: Ramon Pons Vivanco " +msgstr "" + +#: ../lib/GUI.pm:2532 +msgid "Czech: Robert Wolf " +msgstr "" + +#: ../lib/GUI.pm:2533 +msgid "French: Thibault Le Meur " +msgstr "" + +#: ../lib/GUI.pm:2549 +msgid "Do you really want to delete the selected Request?" +msgstr "" + +#: ../lib/GUI.pm:2551 +msgid "Do you really want to delete the selected Key?" +msgstr "" + +#: ../lib/GUI.pm:2553 +msgid "Do you really want to delete the selected Certificate?" +msgstr "" + +#: ../lib/GUI.pm:2603 +msgid "Overwrite Request/Key" +msgstr "" + +#: ../lib/GUI.pm:2609 +msgid "The Key or the Request is already existing!" +msgstr "" + +#: ../lib/GUI.pm:2614 +msgid "You won't be able to sign this Request" +msgstr "" + +#: ../lib/GUI.pm:2619 +msgid "if the corresponding certificate is still valid" +msgstr "" + +#: ../lib/GUI.pm:2636 +msgid "The Certificate will be longer valid than your CA!" +msgstr "" + +#: ../lib/GUI.pm:2638 +msgid "This may cause problems with some software!!" +msgstr "" + +#: ../lib/GUI.pm:2653 +msgid "Expirationdate Warning" +msgstr "" + +#: ../lib/GUI.pm:2688 ../lib/GUI/WORDS.pm:69 +msgid "Serial" +msgstr "" + +#: ../lib/GUI.pm:2690 ../lib/GUI/WORDS.pm:70 ../lib/GUI/X509_browser.pm:175 +msgid "Status" +msgstr "" + +#: ../lib/GUI.pm:2691 ../lib/GUI/WORDS.pm:64 +msgid "Expiration Date" +msgstr "" + +#: ../lib/GUI.pm:2692 +msgid "Revocation Date" +msgstr "" + +#: ../lib/GUI.pm:2693 +msgid "Revocation Reason" +msgstr "" + +#: ../lib/GUI.pm:2719 ../lib/OpenSSL.pm:705 +msgid "EXPIRED" +msgstr "" + +#: ../lib/GUI.pm:2721 ../lib/OpenSSL.pm:718 +msgid "REVOKED" +msgstr "" + +#: ../lib/GUI.pm:2741 +msgid "CA History" +msgstr "" + +#: ../lib/GUI.pm:2775 +msgid "Overwrite Certificate" +msgstr "" + +#: ../lib/GUI.pm:2781 +msgid "There seems to be a certificate with the same Subject already." +msgstr "" + +#: ../lib/GUI.pm:2786 +msgid "" +"Creating a new one (overwrite) will fail if it's not revoked or expired!" +msgstr "" + +#: ../lib/GUI.pm:2792 +msgid "Really try to overwrite the Certificate?" +msgstr "" + +#: ../lib/GUI.pm:2825 +msgid "Convert CA" +msgstr "" + +#: ../lib/GUI.pm:2833 +msgid "" +"This CA seems to be created with openssl 0.9.6x. And it seems like you have " +"switched to openssl 0.9.7x." +msgstr "" + +#: ../lib/GUI.pm:2841 +msgid "" +"You won't be able to revoke the existing certificates without converting the " +"index file of this CA to the new format." +msgstr "" + +#: ../lib/GUI.pm:2849 +msgid "" +"Attention: it will not be easy to switch back, this has to be done manually" +msgstr "" + +#: ../lib/GUI.pm:2875 +msgid "Delete Key" +msgstr "" + +#: ../lib/GUI.pm:2904 +msgid "View Certificate" +msgstr "" + +#: ../lib/GUI.pm:2925 +msgid "Renew Certificate" +msgstr "" + +#: ../lib/GUI.pm:2933 +msgid "Delete Certificate" +msgstr "" + +#: ../lib/GUI.pm:2956 +msgid "Create Key and Certificate (Server)" +msgstr "" + +#: ../lib/GUI.pm:2962 +msgid "Create Key and Certificate (Client)" +msgstr "" + +#: ../lib/GUI.pm:2983 +msgid "Renew Certificate (Server)" +msgstr "" + +#: ../lib/GUI.pm:2990 +msgid "Renew Certificate (Client)" +msgstr "" + +#: ../lib/GUI.pm:3012 +msgid "Sign Request (Server)" +msgstr "" + +#: ../lib/GUI.pm:3019 +msgid "Sign Request (Client)" +msgstr "" + +#: ../lib/GUI.pm:3047 +msgid "View Request" +msgstr "" + +#: ../lib/GUI.pm:3054 +msgid "New Request" +msgstr "" + +#: ../lib/GUI.pm:3076 +msgid "Delete Request" +msgstr "" + +#: ../lib/HELPERS.pm:207 +#, c-format +msgid "Can't write exportdir: %s, %s" +msgstr "" + +#: ../lib/KEY.pm:45 ../lib/KEY.pm:137 +msgid "Please select a Key first" +msgstr "" + +#: ../lib/KEY.pm:54 +msgid "Key file not found:" +msgstr "" + +#: ../lib/KEY.pm:101 +msgid "Can't open key directory" +msgstr "" + +#: ../lib/KEY.pm:194 +msgid "" +"Wrong password given\n" +"Decrypting of the Key failed\n" +"Export is not possible" +msgstr "" + +#: ../lib/KEY.pm:199 +msgid "Converting failed, Export not possible" +msgstr "" + +#: ../lib/KEY.pm:206 ../lib/KEY.pm:410 +#, c-format +msgid "Can't open Key file: %s: %s" +msgstr "" + +#: ../lib/KEY.pm:239 +#, c-format +msgid "Key succesfully exported to %s" +msgstr "" + +#: ../lib/KEY.pm:255 +msgid "Certificate is necessary for export as PKCS#12" +msgstr "" + +#: ../lib/KEY.pm:305 +#, c-format +msgid "Certificate is necessary for export as %s file" +msgstr "" + +#: ../lib/KEY.pm:330 +msgid "Can't read Key file" +msgstr "" + +#: ../lib/KEY.pm:392 +#, c-format +msgid "Invalid format for export requested: %s" +msgstr "" + +#: ../lib/KEY.pm:398 +msgid "Something Failed ??" +msgstr "" + +#: ../lib/KEY.pm:448 +#, c-format +msgid "" +"Can't open Key file:\n" +"%s" +msgstr "" + +#: ../lib/KEY.pm:485 +msgid "The password for your old CA Key is wrong" +msgstr "" + +#: ../lib/OpenSSL.pm:73 +msgid "Creating DSA key in progress..." +msgstr "" + +#: ../lib/OpenSSL.pm:107 +msgid "Creating RSA key in progress..." +msgstr "" + +#: ../lib/OpenSSL.pm:456 +#, c-format +msgid "Can't open CRL '%s': %s" +msgstr "" + +#: ../lib/OpenSSL.pm:471 ../lib/OpenSSL.pm:484 +msgid "Error converting CRL" +msgstr "" + +#: ../lib/OpenSSL.pm:582 ../lib/OpenSSL.pm:595 +msgid "Error converting Certificate" +msgstr "" + +#: ../lib/OpenSSL.pm:655 ../lib/OpenSSL.pm:672 +msgid "Error reading fingerprint from Certificate" +msgstr "" + +#: ../lib/OpenSSL.pm:690 +msgid "Error reading subject from Certificate" +msgstr "" + +#: ../lib/OpenSSL.pm:700 +msgid "Can't read CRL" +msgstr "" + +#: ../lib/OpenSSL.pm:723 +msgid "UNDEFINED" +msgstr "" + +#: ../lib/OpenSSL.pm:750 +#, c-format +msgid "Can't open Request file %s: %s" +msgstr "" + +#: ../lib/OpenSSL.pm:767 ../lib/OpenSSL.pm:781 ../lib/REQ.pm:685 +msgid "Error converting Request" +msgstr "" + +#: ../lib/OpenSSL.pm:863 +#, c-format +msgid "Can't open file %s: %s" +msgstr "" + +#: ../lib/OpenSSL.pm:981 ../lib/OpenSSL.pm:1013 +#, c-format +msgid "Can't read index %s: %s" +msgstr "" + +#: ../lib/OpenSSL.pm:1023 +#, c-format +msgid "Can't write index %s: %s" +msgstr "" + +#: ../lib/REQ.pm:58 +#, c-format +msgid "Strange value for 'opts': %s" +msgstr "" + +#: ../lib/REQ.pm:101 +msgid "Please specify at least Common Name " +msgstr "" + +#: ../lib/REQ.pm:102 +msgid "and Password" +msgstr "" + +#: ../lib/REQ.pm:246 ../lib/REQ.pm:376 +msgid "Request file not found" +msgstr "" + +#: ../lib/REQ.pm:299 +msgid "Can't open Request directory" +msgstr "" + +#: ../lib/REQ.pm:320 +#, c-format +msgid " Read Request: %s" +msgstr "" + +#: ../lib/REQ.pm:414 +msgid "Can't read Request file" +msgstr "" + +#: ../lib/REQ.pm:458 +msgid "Can't read serial" +msgstr "" + +#: ../lib/REQ.pm:531 +msgid "" +"Wrong CA password given\n" +"Signing of the Request failed" +msgstr "" + +#: ../lib/REQ.pm:537 +msgid "" +"CA Key not found\n" +"Signing of the Request failed" +msgstr "" + +#: ../lib/REQ.pm:543 +msgid "" +"Certificate already existing\n" +"Signing of the Request failed" +msgstr "" + +#: ../lib/REQ.pm:549 +msgid "" +"Invalid IP Address given\n" +"Signing of the Request failed" +msgstr "" + +#: ../lib/REQ.pm:556 ../lib/REQ.pm:574 +msgid "Signing of the Request failed" +msgstr "" + +#: ../lib/REQ.pm:581 +msgid "Can't read Certificate file" +msgstr "" + +#: ../lib/REQ.pm:587 ../lib/REQ.pm:597 +msgid "Can't write Certificate file" +msgstr "" + +#: ../lib/REQ.pm:609 +msgid "" +"Request signed succesfully.\n" +"Certificate created" +msgstr "" + +#: ../lib/REQ.pm:650 +msgid "Please select a Request file first" +msgstr "" + +#: ../lib/REQ.pm:656 +msgid "Can't find Request file: " +msgstr "" + +#: ../lib/REQ.pm:662 +msgid "Can't read Request file:" +msgstr "" + +#: ../lib/REQ.pm:708 +msgid "Parsing Request failed" +msgstr "" + +#: ../lib/TCONFIG.pm:42 +msgid "Please select a CA first" +msgstr "" + +#: ../lib/TCONFIG.pm:49 +msgid "Can't open configuration" +msgstr "" + +#: ../lib/TCONFIG.pm:284 ../lib/TCONFIG.pm:299 ../lib/GUI/TCONFIG.pm:47 +#: ../lib/GUI/TCONFIG.pm:1302 +msgid "Can't get CA name" +msgstr "" + +#: ../lib/TCONFIG.pm:327 +msgid "Can't open configfile" +msgstr "" + +#: ../lib/GUI/HELPERS.pm:54 ../lib/GUI/HELPERS.pm:94 ../lib/GUI/HELPERS.pm:135 +msgid "Command Details" +msgstr "" + +#: ../lib/GUI/HELPERS.pm:305 +msgid "Request Files (*.pem, *.der, *.req)" +msgstr "" + +#: ../lib/GUI/HELPERS.pm:312 +msgid "All Files (*.*)" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:74 +msgid "" +"All Settings are written unchanged to openssl.conf.\n" +"So please study the documentation of OpenSSL if you don't know exactly what " +"to do.\n" +"If you are still unsure - keep the defaults and everything is expected to " +"work fine." +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:108 ../lib/GUI/TCONFIG.pm:116 +msgid "OpenSSL Configuration" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:129 +msgid "Only change these options, if you really know, what you are doing!!" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:137 +msgid "You should be aware, that some options may break some crappy software!!" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:146 ../lib/GUI/TCONFIG.pm:1348 +msgid "If you are unsure: leave the defaults untouched" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:182 +msgid "These Settings are passed to OpenSSL for creating Server Certificates" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:187 ../lib/GUI/TCONFIG.pm:612 +#: ../lib/GUI/TCONFIG.pm:1019 ../lib/GUI/TCONFIG.pm:1239 +#: ../lib/GUI/TCONFIG.pm:1340 +msgid "Multiple Values can be separated by \",\"" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:207 ../lib/GUI/TCONFIG.pm:209 +msgid "Server Certificate Settings" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:215 ../lib/GUI/TCONFIG.pm:638 +#: ../lib/GUI/TCONFIG.pm:1047 ../lib/GUI/TCONFIG.pm:1462 +msgid "Subject alternative name (subjectAltName):" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:312 ../lib/GUI/TCONFIG.pm:744 +#: ../lib/GUI/TCONFIG.pm:1107 ../lib/GUI/TCONFIG.pm:1358 +msgid "Key Usage (keyUsage):" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:391 ../lib/GUI/TCONFIG.pm:819 +msgid "Extended Key Usage (extendedKeyUsage):" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:467 ../lib/GUI/TCONFIG.pm:894 +#: ../lib/GUI/TCONFIG.pm:1076 ../lib/GUI/TCONFIG.pm:1431 +msgid "Netscape Certificate Type (nsCertType):" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:496 +msgid "Netscape SSL Server Name (nsSslServerName):" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:521 ../lib/GUI/TCONFIG.pm:924 +#: ../lib/GUI/TCONFIG.pm:1182 +msgid "Netscape Revocation URL (nsRevocationUrl):" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:546 ../lib/GUI/TCONFIG.pm:948 +msgid "Netscape Renewal URL (nsRenewalUrl):" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:607 +msgid "These Settings are passed to OpenSSL for creating Client Certificates" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:632 +msgid "Client Certificate Settings" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:1014 +msgid "These Settings are passed to OpenSSL for creating CA Certificates" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:1039 ../lib/GUI/TCONFIG.pm:1041 +msgid "CA Certificate Settings" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:1234 +msgid "" +"These Settings are passed to OpenSSL for creating Certificate Revocation " +"Lists" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:1260 +msgid "Revocation List Settings" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:1322 +msgid "CA Configuration" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:1330 +msgid "These Settings are passed to OpenSSL for creating this CA Certificate" +msgstr "" + +#: ../lib/GUI/TCONFIG.pm:1335 +msgid "and the CA Certificates of every SubCA, created with this CA." +msgstr "" + +#: ../lib/GUI/WORDS.pm:26 ../lib/GUI/WORDS.pm:73 +msgid "Not set" +msgstr "" + +#: ../lib/GUI/WORDS.pm:27 ../lib/GUI/WORDS.pm:74 +msgid "Ask User" +msgstr "" + +#: ../lib/GUI/WORDS.pm:28 ../lib/GUI/WORDS.pm:75 +msgid "critical" +msgstr "" + +#: ../lib/GUI/WORDS.pm:29 ../lib/GUI/WORDS.pm:76 +msgid "not critical" +msgstr "" + +#: ../lib/GUI/WORDS.pm:30 ../lib/GUI/WORDS.pm:77 +msgid "Copy Email" +msgstr "" + +#: ../lib/GUI/WORDS.pm:31 ../lib/GUI/WORDS.pm:78 +msgid "raw" +msgstr "" + +#: ../lib/GUI/WORDS.pm:32 ../lib/GUI/WORDS.pm:79 +msgid "DNS Name" +msgstr "" + +#: ../lib/GUI/WORDS.pm:33 ../lib/GUI/WORDS.pm:81 +msgid "IP Address" +msgstr "" + +#: ../lib/GUI/WORDS.pm:34 ../lib/GUI/WORDS.pm:80 +msgid "Email" +msgstr "" + +#: ../lib/GUI/WORDS.pm:35 ../lib/GUI/WORDS.pm:82 +msgid "SSL Server" +msgstr "" + +#: ../lib/GUI/WORDS.pm:36 ../lib/GUI/WORDS.pm:83 +msgid "SSL Server, SSL Client" +msgstr "" + +#: ../lib/GUI/WORDS.pm:37 ../lib/GUI/WORDS.pm:84 +msgid "Key Encipherment" +msgstr "" + +#: ../lib/GUI/WORDS.pm:38 ../lib/GUI/WORDS.pm:85 +msgid "Digital Signature" +msgstr "" + +#: ../lib/GUI/WORDS.pm:39 ../lib/GUI/WORDS.pm:86 +msgid "Key Encipherment, Digital Signature" +msgstr "" + +#: ../lib/GUI/WORDS.pm:40 ../lib/GUI/WORDS.pm:87 +msgid "Object Signing" +msgstr "" + +#: ../lib/GUI/WORDS.pm:41 ../lib/GUI/WORDS.pm:91 +msgid "SSL Client, Object Signing" +msgstr "" + +#: ../lib/GUI/WORDS.pm:42 ../lib/GUI/WORDS.pm:89 +msgid "SSL Client, Email(S/MIME)" +msgstr "" + +#: ../lib/GUI/WORDS.pm:43 ../lib/GUI/WORDS.pm:90 +msgid "SSL Client" +msgstr "" + +#: ../lib/GUI/WORDS.pm:44 ../lib/GUI/WORDS.pm:88 +msgid "Email(S/MIME)" +msgstr "" + +#: ../lib/GUI/WORDS.pm:45 ../lib/GUI/WORDS.pm:92 +msgid "SSL Client, Email, Object Signing" +msgstr "" + +#: ../lib/GUI/WORDS.pm:46 ../lib/GUI/WORDS.pm:93 +msgid "Object Signing CA" +msgstr "" + +#: ../lib/GUI/WORDS.pm:47 ../lib/GUI/WORDS.pm:94 +msgid "S/MIME CA" +msgstr "" + +#: ../lib/GUI/WORDS.pm:48 ../lib/GUI/WORDS.pm:95 +msgid "SSL CA" +msgstr "" + +#: ../lib/GUI/WORDS.pm:49 ../lib/GUI/WORDS.pm:96 +msgid "SSL CA, S/MIME CA" +msgstr "" + +#: ../lib/GUI/WORDS.pm:50 ../lib/GUI/WORDS.pm:97 +msgid "SSL CA, Object Signing CA" +msgstr "" + +#: ../lib/GUI/WORDS.pm:51 ../lib/GUI/WORDS.pm:98 +msgid "S/MIME CA, Object Signing CA" +msgstr "" + +#: ../lib/GUI/WORDS.pm:52 ../lib/GUI/WORDS.pm:99 +msgid "SSL CA, S/MIME CA, Object Signing CA" +msgstr "" + +#: ../lib/GUI/WORDS.pm:53 ../lib/GUI/WORDS.pm:100 +msgid "Certificate Signing" +msgstr "" + +#: ../lib/GUI/WORDS.pm:54 ../lib/GUI/WORDS.pm:101 +msgid "CRL Signing" +msgstr "" + +#: ../lib/GUI/WORDS.pm:55 ../lib/GUI/WORDS.pm:102 +msgid "Certificate Signing, CRL Signing" +msgstr "" + +#: ../lib/GUI/WORDS.pm:63 +msgid "Creation Date" +msgstr "" + +#: ../lib/GUI/WORDS.pm:66 +msgid "Public Key Algorithm" +msgstr "" + +#: ../lib/GUI/WORDS.pm:67 +msgid "Signature Algorithm" +msgstr "" + +#: ../lib/GUI/WORDS.pm:71 ../lib/GUI/X509_infobox.pm:80 +msgid "Fingerprint (MD5)" +msgstr "" + +#: ../lib/GUI/WORDS.pm:72 ../lib/GUI/X509_infobox.pm:89 +msgid "Fingerprint (SHA1)" +msgstr "" + +#: ../lib/GUI/X509_browser.pm:448 +msgid "Certificate Information" +msgstr "" + +#: ../lib/GUI/X509_browser.pm:452 +msgid "Request Information" +msgstr "" + +#: ../lib/GUI/X509_browser.pm:571 +msgid "Invalid browser mode for selection_fname():" +msgstr "" + +#: ../lib/GUI/X509_browser.pm:571 ../lib/GUI/X509_browser.pm:607 +#: ../lib/GUI/X509_browser.pm:656 ../lib/GUI/X509_browser.pm:677 +#: ../lib/GUI/X509_browser.pm:698 ../lib/GUI/X509_browser.pm:725 +msgid " " +msgstr "" + +#: ../lib/GUI/X509_browser.pm:607 +msgid "Invalid browser mode for selection_dn():" +msgstr "" + +#: ../lib/GUI/X509_browser.pm:656 ../lib/GUI/X509_browser.pm:677 +msgid "Invalid browser mode for selection_cn():" +msgstr "" + +#: ../lib/GUI/X509_browser.pm:698 +msgid "Invalid browser mode for selection_status():" +msgstr "" + +#: ../lib/GUI/X509_browser.pm:725 +msgid "Invalid browser mode for selection_type():" +msgstr "" + +#: ../tinyca2:63 +#, c-format +msgid "Can't execute %s.\n" +msgstr "" + +#: ../tinyca2:64 +msgid "Configure correct path to openssl in tinyca.\n" +msgstr "" + +#: ../tinyca2:69 +msgid "zip command not found, support disabled.\n" +msgstr "" + +#: ../tinyca2:70 +msgid "Configure correct path to zip in tinyca.\n" +msgstr "" + +#: ../tinyca2:74 +msgid "tar command not found, support disabled.\n" +msgstr "" + +#: ../tinyca2:75 +msgid "Configure correct path to tar in tinyca.\n" +msgstr "" + +#: ../tinyca2:82 +msgid "Can't find templatedir.\n" +msgstr "" + +#: ../tinyca2:83 +msgid "Please configure correct path with templates in tinyca.\n" +msgstr "" diff --git a/templates/openssl.cnf b/templates/openssl.cnf new file mode 100644 index 0000000..8bc7e57 --- /dev/null +++ b/templates/openssl.cnf @@ -0,0 +1,147 @@ +[ ca ] +default_ca = server_ca + +[ client_ca ] +dir = %dir% +certs = $dir/certs +crl_dir = $dir/crl +database = $dir/index.txt +new_certs_dir = $dir/newcerts +certificate = $dir/cacert.pem +serial = $dir/serial +crl = $dir/crl.pem +private_key = $dir/cacert.key +RANDFILE = $dir/.rand +x509_extensions = client_cert +default_days = 365 +default_crl_days= 30 +default_md = sha1 +preserve = no +policy = policy_client + +[ server_ca ] +dir = %dir% +certs = $dir/certs +crl_dir = $dir/crl +database = $dir/index.txt +new_certs_dir = $dir/newcerts +certificate = $dir/cacert.pem +serial = $dir/serial +crl = $dir/crl.pem +private_key = $dir/cacert.key +RANDFILE = $dir/.rand +x509_extensions = server_cert +default_days = 365 +default_crl_days= 30 +default_md = sha1 +preserve = no +policy = policy_server + +[ ca_ca ] +dir = %dir% +certs = $dir/certs +crl_dir = $dir/crl +database = $dir/index.txt +new_certs_dir = $dir/newcerts +certificate = $dir/cacert.pem +serial = $dir/serial +crl = $dir/crl.pem +private_key = $dir/cacert.key +RANDFILE = $dir/.rand +x509_extensions = v3_ca +default_days = 365 +default_crl_days= 30 +default_md = sha1 +preserve = no +policy = policy_ca + +[ policy_client ] +countryName = optional +stateOrProvinceName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +[ policy_server ] +countryName = optional +stateOrProvinceName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +[ policy_ca ] +countryName = optional +stateOrProvinceName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +[ req ] +default_bits = 4096 +default_keyfile = privkey.pem +distinguished_name = req_distinguished_name +attributes = req_attributes +x509_extensions = v3_ca +string_mask = nombstr +req_extensions = v3_req + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_min = 2 +countryName_max = 2 +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Some-State +localityName = Locality Name (eg, city) +0.organizationName = Organization Name (eg, company) +0.organizationName_default = Internet Widgits Pty Ltd +organizationalUnitName = Organizational Unit Name (eg, section) +commonName = Common Name (eg, YOUR name) +commonName_max = 64 +emailAddress = Email Address +emailAddress_max = 40 + +[ v3_req ] +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 +unstructuredName = An optional company name + +[ client_cert ] +basicConstraints=CA:FALSE +nsCertType = client, email, objsign +nsComment = "TinyCA Generated Certificate" +keyUsage = nonRepudiation, digitalSignature, keyEncipherment +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always +subjectAltName=email:copy +issuerAltName=issuer:copy + +[ server_cert ] +basicConstraints=CA:FALSE +nsCertType = server +nsComment = "TinyCA Generated Certificate" +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always +subjectAltName=email:copy +issuerAltName=issuer:copy + +[ v3_ca ] +nsComment = "TinyCA Generated Certificate" +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always,issuer:always +basicConstraints = critical,CA:true +keyUsage = keyCertSign, cRLSign +nsCertType = sslCA, emailCA +subjectAltName=email:copy +issuerAltName=issuer:copy + +[ crl_ext ] +authorityKeyIdentifier=keyid:always,issuer:always diff --git a/tinyca2 b/tinyca2 new file mode 100755 index 0000000..7a7998c --- /dev/null +++ b/tinyca2 @@ -0,0 +1,115 @@ +#!/usr/bin/perl -w +# +# $Id: tinyca2,v 1.6 2006/07/04 19:53:16 sm Exp $ +# +# Copyright (c) Stephan Martin +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + +BEGIN { unshift(@INC, './lib'); # put here the location of the modules +} + +use strict; + +use Gtk2 '-init'; + +use MIME::Base64; + +use POSIX; +use Locale::gettext; + +use OpenSSL; +use CA; +use GUI; +use HELPERS; +use GUI::TCONFIG; +use GUI::HELPERS; +use GUI::CALLBACK; +use GUI::WORDS; +use GUI::X509_infobox; +use GUI::X509_browser; +use CERT; +use REQ; +use KEY; +use TCONFIG; + +setlocale(LC_MESSAGES, ""); +bindtextdomain("tinyca2", "./locale/"); +textdomain("tinyca2"); + +# https://bugs.gentoo.org/show_bug.cgi?id=78576 +$ENV{XLIB_SKIP_ARGB_VISUALS}= '1'; + +my $init = {}; + +# location of openssl +$init->{'opensslbin'} = "/usr/bin/openssl"; +$init->{'zipbin'} = "/usr/bin/zip"; +$init->{'tarbin'} = "/bin/tar"; + +if(not -x $init->{'opensslbin'}) { + printf(gettext("Can't execute %s.\n"), $init->{'opensslbin'}); + print gettext("Configure correct path to openssl in tinyca.\n"); + exit(1); +} + +if(not -x $init->{'zipbin'}) { + print gettext("zip command not found, support disabled.\n"); + print gettext("Configure correct path to zip in tinyca.\n"); +} + +if(not -x $init->{'tarbin'}) { + print gettext("tar command not found, support disabled.\n"); + print gettext("Configure correct path to tar in tinyca.\n"); +} + +# directory with the templates +$init->{'templatedir'} = "./templates"; + +if(not -d $init->{'templatedir'}) { + print gettext("Can't find templatedir.\n"); + print gettext("Please configure correct path with templates in tinyca.\n"); + exit(1); +} + +# location for CA files +$init->{'basedir'} = $ENV{HOME}."/.TinyCA"; +$init->{'exportdir'} = $ENV{HOME}; + +umask(0077); + +# create main object and initialize CA +my $gui = GUI->new($init); + +# and now run... +$gui->{'mw'}->show_all(); + +# decide what to do on startup +if(@{$gui->{'CA'}->{'calist'}}) { + $gui->{'CA'}->get_open_name($gui); +} else { + $gui->{'CA'}->get_ca_create($gui); +} + +sub _ { + my $s = gettext(@_); + utf8::decode($s); + return($s); +} + +Gtk2->main(); + +exit(0); + diff --git a/tinyca2.desktop b/tinyca2.desktop new file mode 100644 index 0000000..d482c3a --- /dev/null +++ b/tinyca2.desktop @@ -0,0 +1,38 @@ +[Desktop Entry] +Encoding=UTF-8 +Type=Application +GenericName=Tool to manage a Certification Authority +Name=TinyCA2 +Exec=tinyca2 + +Categories=Network;Security +GenericName[bg]=GenericName(tinyca.desktop): Управление на сертификационните регистри (Certification Authority) +Name[cs]=TinyCA2 +GenericName[cs]=Nástroj pro správu certifikační autority +Name[de]=TinyCA2 +GenericName[de]=Werkzeug zum Verwalten einer Certification Authority +Name[es]=TinyCA2 +GenericName[es]=Herramienta para gestionar autoridades certificadoras +Name[fr]=TinyCA2 +GenericName[fr]=Outil de gestion d'une autorité de certification +Name[hu]=TinyCA2 +GenericName[hu]=CA (Certification Authority) kezelő segédeszköz +Name[it]=TinyCA2 +GenericName[it]=Tool d'amministrazione per una certification authority +Name[ja]=TinyCA2 +GenericName[ja]=認証局の管理ツール +Name[nb]=TinyCA2 +GenericName[nb]=Administrasjonsverktøy for sertifikater +Name[nl]=TinyCA2 +GenericName[nl]=Programma om een certificaat autoriteit te beheren +Name[pl]=TinyCA2 +GenericName[pl]=Narzędzie do zarządzania centrum certyfikacyjnym +Name[pt_BR]=TinyCA2 +GenericName[pt_BR]=Ferramenta para gerenciar uma Autoridade de Certificação +Name[sk]=TinyCA2 +GenericName[sk]=Nástroj pre správu certifikačnej autority +Name[zh_CN]=TinyCA2 +GenericName[zh_CN]=管理证书授权者的工具 +Name[zh_TW]=TinyCA2 +GenericName[zh_TW]=管理認證授權的工具 +X-SuSE-translate=true diff --git a/tinyca2.spec b/tinyca2.spec new file mode 100644 index 0000000..ad152ff --- /dev/null +++ b/tinyca2.spec @@ -0,0 +1,170 @@ +# spec file for package tinyca +# +# $Id: tinyca2.spec,v 1.9 2006/07/25 20:10:54 sm Exp $ +# +# Copyright (c) 2002 Stephan Martin +# This file and all modifications and additions to the pristine +# package are under the same license as the package itself. +# + +%define bindir %{_bindir} +%define libdir %{_datadir}/TinyCA2/lib +%define templatesdir %{_datadir}/TinyCA2/templates +%define localedir %{_datadir}/TinyCA2/locale/ + +Name: tinyca2 +URL: http://tinyca.sm-zone.net/ +Group: Productivity/Networking/Security +License: GPL +Requires: perl perl-Gtk2 perl-MIME-Base64 +Packager: Stephan Martin +Version: @version@ +Release: 0 +Source0: %{name}-%{version}.tar.gz +Source1: %{name}.desktop +Summary: Graphical Tool for Managing a Certification Authority +BuildArch: noarch +BuildRoot: %{_tmppath}/%{name}-%{version}-build + +%description +TinyCA is a graphical tool written in Perl/Gtk to manage a small +Certification Authority (CA) using openssl. + +TinyCA supports - creation and revocation of x509 - S/MIME + certificates. + +- PKCS#10 requests. + +- exporting certificates as PEM, DER, TXT, and PKCS#12. + +- server certificates for use in web servers, email servers, IPsec, + and more. + +- client certificates for use in web browsers, email clients, IPsec, + and more. + +- creation and management of SubCAs + + +Authors: +-------- +Stephan Martin + +%prep +%setup + +%build +# Configure pristine source +perl -pi -e 's:./lib:%{libdir}:g' tinyca2 +perl -pi -e 's:./templates:%{templatesdir}:g' tinyca2 +perl -pi -e 's:./locale:%{localedir}:g' tinyca2 +make -C po + +%install +[ "$RPM_BUILD_ROOT" != "/" ] && [ -d $RPM_BUILD_ROOT ] && rm -rf $RPM_BUILD_ROOT; + +LANGUAGES="de es cs fr sv" + +mkdir -p $RPM_BUILD_ROOT%{bindir} +mkdir -p $RPM_BUILD_ROOT%{libdir} +mkdir -p $RPM_BUILD_ROOT%{libdir}/GUI +mkdir -p $RPM_BUILD_ROOT%{templatesdir} + +install -m 644 lib/*.pm $RPM_BUILD_ROOT%{libdir} +install -m 644 lib/GUI/*.pm $RPM_BUILD_ROOT%{libdir}/GUI/ +install -m 644 templates/openssl.cnf $RPM_BUILD_ROOT%{templatesdir} +install -m 755 tinyca2 $RPM_BUILD_ROOT%{bindir} +mkdir -p $RPM_BUILD_ROOT/usr/share/applications/ +install -m 644 tinyca2.desktop $RPM_BUILD_ROOT/usr/share/applications/ + +for LANG in $LANGUAGES; do + mkdir -p $RPM_BUILD_ROOT%{localedir}/$LANG/LC_MESSAGES/ + install -m 644 locale/$LANG/LC_MESSAGES/tinyca2.mo %{buildroot}%{localedir}/$LANG/LC_MESSAGES/ +done + +%clean +rm -rf %{buildroot} + +%files +%defattr(-,root,root) +%doc CHANGES +%dir %{_datadir}/TinyCA2 +%{bindir}/tinyca2 +%{_datadir}/TinyCA2/* +%{_datadir}/applications/* + +%changelog +* Sun Dec 5 2004 - sm@sm-zone.net +- import functioins added +* Fri Aug 13 2004 - sm@sm-zone.net +- czech translation +* Sun Jun 13 2004 - sm@sm-zone.net +- gui polishing +- code cleanup +- some usability improvements +* Wed Jun 2 2004 - sm@sm-zone.net +- gui polishing +- GUI module splitted to several files +* Fri Oct 3 2003 - sm@sm-zone.net +- added a lot of configuration options +- correctly import/show details of requests without extensions + (thanks to James.Leavitt@anywaregroup.com) +* Mon Sep 1 2003 - sm@sm-zone.net +- added renewal of certificates +* Wed Aug 13 2003 - sm@sm-zone.net +- rewite, now using perl-Gtk +* Sat Jul 5 2003 - sm@sm-zone.net +- added german translation +* Tue Jul 1 2003 - sm@sm-zone.net +- convert index.txt if openssl changed from 0.9.6x to 0.9.7x +* Fri Jun 27 2003 - sm@sm-zone.net +- added export into zip-file + thanks to ludwig.nussel@suse.de +* Mon Jun 23 2003 - sm@sm-zone.net +- some tiny usability improvements + thanks to ludwig.nussel@suse.de again +* Thu Jun 19 2003 - sm@sm-zone.net +- some usability improvements + thanks to ludwig.nussel@suse.de +- some more configuration options +* Fri Oct 4 2002 - sm@sm-zone.net +- Fixed bug exporting keys in PEM format +- Fixed possible empty lines in cert/key/reqlist + thanks to waldemar.mertke@gmx.de +* Fri Sep 27 2002 - sm@sm-zone.net +- fixed some minor bugs and typos (e.g. concerning openssl 0.9.7) + thanks to iebgener@yahoo.com and waldemar.mertke@gmx.de +* Wed Aug 21 2002 - sm@sm-zone.net +- fixed revocation +- added some colors +- thanks to curly@e-card.bg +* Sun Aug 18 2002 - sm@sm-zone.net +- new version 0.4.0 +- works independent of OpenCA modules now +- some enhancements to functionality (e.g. export of key without + passwd) +- some smaller bugfixes in usability +- new specfile (thanks to oron@actcom.co.il) +* Thu Jun 6 2002 - Oron Peled +- Cleaned .spec file +* Mon Jun 3 2002 - sm@sm-zone.net +- fixed wrong templatedir when creating new CA +* Sun Jun 2 2002 - sm@sm-zone.net +- fixed some minor bugs and typos +* Sat May 11 2002 - sm@sm-zone.net +- Added parser for x509 extensions +* Fri May 03 2002 - sm@sm-zone.net +- added possibility to view requests/certificates +* Thu Apr 18 2002 - sm@sm-zone.net +- added configuration +* Sun Apr 7 2002 - sm@sm-zone.net +- improved usability +* Sun Mar 31 2002 - sm@sm-zone.net +- added function to delete ca +* Sat Mar 30 2002 - sm@sm-zone.net +- allow import of pkcs#10 requests +* Thu Mar 21 2002 - sm@sm-zone.et +- use different listboxes +* Mon Mar 18 2002 - sm@sm-zone.net +- initial package +