⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ca.c

📁 本软件包将每个openssl的apps程序做成一个可直接运行调试的VC Console 类型应用程序
💻 C
📖 第 1 页 / 共 4 页
字号:
/* apps/ca.c *//* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. *  * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to.  The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code.  The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). *  * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. *  * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *    "This product includes cryptographic software written by *     Eric Young (eay@cryptsoft.com)" *    The word 'cryptographic' can be left out if the rouines from the library *    being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from  *    the apps directory (application code) you must include an acknowledgement: *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" *  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. *  * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed.  i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] *//* The PPKI stuff has been donated by Jeff Barber <jeffb@issl.atl.hp.com> */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include "apps.h"#include <openssl/conf.h>#include <openssl/bio.h>#include <openssl/err.h>#include <openssl/bn.h>#include <openssl/txt_db.h>#include <openssl/evp.h>#include <openssl/x509.h>#include <openssl/x509v3.h>#include <openssl/objects.h>#include <openssl/pem.h>#ifndef W_OK#  ifdef VMS#    if defined(__DECC)#      include <unistd.h>#    else#      include <unixlib.h>#    endif#  elif !defined(VXWORKS)#    include <sys/file.h>#  endif#endif#ifndef W_OK#  define F_OK 0#  define X_OK 1#  define W_OK 2#  define R_OK 4#endif#undef PROG#define PROG ca_main#define BASE_SECTION	"ca"#define CONFIG_FILE "openssl.cnf"#define ENV_DEFAULT_CA		"default_ca"#define ENV_DIR			"dir"#define ENV_CERTS		"certs"#define ENV_CRL_DIR		"crl_dir"#define ENV_CA_DB		"CA_DB"#define ENV_NEW_CERTS_DIR	"new_certs_dir"#define ENV_CERTIFICATE 	"certificate"#define ENV_SERIAL		"serial"#define ENV_CRL			"crl"#define ENV_PRIVATE_KEY		"private_key"#define ENV_RANDFILE		"RANDFILE"#define ENV_DEFAULT_DAYS 	"default_days"#define ENV_DEFAULT_STARTDATE 	"default_startdate"#define ENV_DEFAULT_ENDDATE 	"default_enddate"#define ENV_DEFAULT_CRL_DAYS 	"default_crl_days"#define ENV_DEFAULT_CRL_HOURS 	"default_crl_hours"#define ENV_DEFAULT_MD		"default_md"#define ENV_PRESERVE		"preserve"#define ENV_POLICY      	"policy"#define ENV_EXTENSIONS      	"x509_extensions"#define ENV_CRLEXT      	"crl_extensions"#define ENV_MSIE_HACK		"msie_hack"#define ENV_DATABASE		"database"#define DB_type         0#define DB_exp_date     1#define DB_rev_date     2#define DB_serial       3       /* index - unique */#define DB_file         4       #define DB_name         5       /* index - unique for active */#define DB_NUMBER       6#define DB_TYPE_REV	'R'#define DB_TYPE_EXP	'E'#define DB_TYPE_VAL	'V'static char *ca_usage[]={"usage: ca args\n","\n"," -verbose        - Talk alot while doing things\n"," -config file    - A config file\n"," -name arg       - The particular CA definition to use\n"," -gencrl         - Generate a new CRL\n"," -crldays days   - Days is when the next CRL is due\n"," -crlhours hours - Hours is when the next CRL is due\n"," -startdate YYMMDDHHMMSSZ  - certificate validity notBefore\n"," -enddate YYMMDDHHMMSSZ    - certificate validity notAfter (overrides -days)\n"," -days arg       - number of days to certify the certificate for\n"," -md arg         - md to use, one of md2, md5, sha or sha1\n"," -policy arg     - The CA 'policy' to support\n"," -keyfile arg    - PEM private key file\n"," -key arg        - key to decode the private key if it is encrypted\n"," -cert file      - The CA certificate\n"," -in file        - The input PEM encoded certificate request(s)\n"," -out file       - Where to put the output file(s)\n"," -outdir dir     - Where to put output certificates\n"," -infiles ....   - The last argument, requests to process\n"," -spkac file     - File contains DN and signed public key and challenge\n"," -ss_cert file   - File contains a self signed cert to sign\n"," -preserveDN     - Don't re-order the DN\n"," -batch          - Don't ask questions\n"," -msie_hack      - msie modifications to handle all those universal strings\n"," -revoke file    - Revoke a certificate (given in file)\n"," -extensions ..  - Extension section (override value in config file)\n"," -crlexts ..     - CRL extension section (override value in config file)\n",NULL};#ifdef EFENCEextern int EF_PROTECT_FREE;extern int EF_PROTECT_BELOW;extern int EF_ALIGNMENT;#endifstatic void lookup_fail(char *name,char *tag);static unsigned long index_serial_hash(char **a);static int index_serial_cmp(char **a, char **b);static unsigned long index_name_hash(char **a);static int index_name_qual(char **a);static int index_name_cmp(char **a,char **b);static BIGNUM *load_serial(char *serialfile);static int save_serial(char *serialfile, BIGNUM *serial);static int certify(X509 **xret, char *infile,EVP_PKEY *pkey,X509 *x509,		   const EVP_MD *dgst,STACK_OF(CONF_VALUE) *policy,TXT_DB *db,		   BIGNUM *serial, char *startdate,char *enddate, int days,		   int batch, char *ext_sect, LHASH *conf,int verbose);static int certify_cert(X509 **xret, char *infile,EVP_PKEY *pkey,X509 *x509,			const EVP_MD *dgst,STACK_OF(CONF_VALUE) *policy,			TXT_DB *db, BIGNUM *serial,char *startdate,			char *enddate, int days, int batch, char *ext_sect,			LHASH *conf,int verbose);static int certify_spkac(X509 **xret, char *infile,EVP_PKEY *pkey,X509 *x509,			 const EVP_MD *dgst,STACK_OF(CONF_VALUE) *policy,			 TXT_DB *db, BIGNUM *serial,char *startdate,			 char *enddate, int days, char *ext_sect,LHASH *conf,				int verbose);static int fix_data(int nid, int *type);static void write_new_certificate(BIO *bp, X509 *x, int output_der, int notext);static int do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, const EVP_MD *dgst,	STACK_OF(CONF_VALUE) *policy, TXT_DB *db, BIGNUM *serial,	char *startdate, char *enddate, int days, int batch, int verbose,	X509_REQ *req, char *ext_sect, LHASH *conf);static int do_revoke(X509 *x509, TXT_DB *db);static int check_time_format(char *str);static LHASH *conf=NULL;static char *section=NULL;static int preserve=0;static int msie_hack=0;int MAIN(int, char **);int MAIN(int argc, char **argv)	{	char *key=NULL,*passargin=NULL;	int total=0;	int total_done=0;	int badops=0;	int ret=1;	int req=0;	int verbose=0;	int gencrl=0;	int dorevoke=0;	long crldays=0;	long crlhours=0;	long errorline= -1;	char *configfile=NULL;	char *md=NULL;	char *policy=NULL;	char *keyfile=NULL;	char *certfile=NULL;	char *infile=NULL;	char *spkac_file=NULL;	char *ss_cert_file=NULL;	EVP_PKEY *pkey=NULL;	int output_der = 0;	char *outfile=NULL;	char *outdir=NULL;	char *serialfile=NULL;	char *extensions=NULL;	char *crl_ext=NULL;	BIGNUM *serial=NULL;	char *startdate=NULL;	char *enddate=NULL;	int days=0;	int batch=0;	int notext=0;	X509 *x509=NULL;	X509 *x=NULL;	BIO *in=NULL,*out=NULL,*Sout=NULL,*Cout=NULL;	char *dbfile=NULL;	TXT_DB *db=NULL;	X509_CRL *crl=NULL;	X509_CRL_INFO *ci=NULL;	X509_REVOKED *r=NULL;	char **pp,*p,*f;	int i,j;	long l;	const EVP_MD *dgst=NULL;	STACK_OF(CONF_VALUE) *attribs=NULL;	STACK_OF(X509) *cert_sk=NULL;	BIO *hex=NULL;#undef BSIZE#define BSIZE 256	MS_STATIC char buf[3][BSIZE];	char *randfile=NULL;#ifdef EFENCEEF_PROTECT_FREE=1;EF_PROTECT_BELOW=1;EF_ALIGNMENT=0;#endif	apps_startup();	conf = NULL;	key = NULL;	section = NULL;	preserve=0;	msie_hack=0;	if (bio_err == NULL)		if ((bio_err=BIO_new(BIO_s_file())) != NULL)			BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);	argc--;	argv++;	while (argc >= 1)		{		if	(strcmp(*argv,"-verbose") == 0)			verbose=1;		else if	(strcmp(*argv,"-config") == 0)			{			if (--argc < 1) goto bad;			configfile= *(++argv);			}		else if (strcmp(*argv,"-name") == 0)			{			if (--argc < 1) goto bad;			section= *(++argv);			}		else if (strcmp(*argv,"-startdate") == 0)			{			if (--argc < 1) goto bad;			startdate= *(++argv);			}		else if (strcmp(*argv,"-enddate") == 0)			{			if (--argc < 1) goto bad;			enddate= *(++argv);			}		else if (strcmp(*argv,"-days") == 0)			{			if (--argc < 1) goto bad;			days=atoi(*(++argv));			}		else if (strcmp(*argv,"-md") == 0)			{			if (--argc < 1) goto bad;			md= *(++argv);			}		else if (strcmp(*argv,"-policy") == 0)			{			if (--argc < 1) goto bad;			policy= *(++argv);			}		else if (strcmp(*argv,"-keyfile") == 0)			{			if (--argc < 1) goto bad;			keyfile= *(++argv);			}		else if (strcmp(*argv,"-passin") == 0)			{			if (--argc < 1) goto bad;			passargin= *(++argv);			}		else if (strcmp(*argv,"-key") == 0)			{			if (--argc < 1) goto bad;			key= *(++argv);			}		else if (strcmp(*argv,"-cert") == 0)			{			if (--argc < 1) goto bad;			certfile= *(++argv);			}		else if (strcmp(*argv,"-in") == 0)			{			if (--argc < 1) goto bad;			infile= *(++argv);			req=1;			}		else if (strcmp(*argv,"-out") == 0)			{			if (--argc < 1) goto bad;			outfile= *(++argv);			}		else if (strcmp(*argv,"-outdir") == 0)			{			if (--argc < 1) goto bad;			outdir= *(++argv);			}		else if (strcmp(*argv,"-notext") == 0)			notext=1;		else if (strcmp(*argv,"-batch") == 0)			batch=1;		else if (strcmp(*argv,"-preserveDN") == 0)			preserve=1;		else if (strcmp(*argv,"-gencrl") == 0)			gencrl=1;		else if (strcmp(*argv,"-msie_hack") == 0)			msie_hack=1;		else if (strcmp(*argv,"-crldays") == 0)			{			if (--argc < 1) goto bad;			crldays= atol(*(++argv));			}		else if (strcmp(*argv,"-crlhours") == 0)			{			if (--argc < 1) goto bad;			crlhours= atol(*(++argv));			}		else if (strcmp(*argv,"-infiles") == 0)			{			argc--;			argv++;			req=1;			break;			}		else if (strcmp(*argv, "-ss_cert") == 0)			{			if (--argc < 1) goto bad;			ss_cert_file = *(++argv);			req=1;			}		else if (strcmp(*argv, "-spkac") == 0)			{			if (--argc < 1) goto bad;			spkac_file = *(++argv);			req=1;			}		else if (strcmp(*argv,"-revoke") == 0)			{			if (--argc < 1) goto bad;			infile= *(++argv);			dorevoke=1;			}		else if (strcmp(*argv,"-extensions") == 0)			{			if (--argc < 1) goto bad;			extensions= *(++argv);			}		else if (strcmp(*argv,"-crlexts") == 0)			{			if (--argc < 1) goto bad;			crl_ext= *(++argv);			}		else			{bad:			BIO_printf(bio_err,"unknown option %s\n",*argv);			badops=1;			break;			}		argc--;		argv++;		}	if (badops)		{		for (pp=ca_usage; (*pp != NULL); pp++)			BIO_printf(bio_err,*pp);		goto err;		}	ERR_load_crypto_strings();	/*****************************************************************/	if (configfile == NULL) configfile = getenv("OPENSSL_CONF");	if (configfile == NULL) configfile = getenv("SSLEAY_CONF");	if (configfile == NULL)		{		/* We will just use 'buf[0]' as a temporary buffer.  */#ifdef VMS		strncpy(buf[0],X509_get_default_cert_area(),			sizeof(buf[0])-1-sizeof(CONFIG_FILE));#else		strncpy(buf[0],X509_get_default_cert_area(),			sizeof(buf[0])-2-sizeof(CONFIG_FILE));		strcat(buf[0],"/");#endif		strcat(buf[0],CONFIG_FILE);		configfile=buf[0];		}	BIO_printf(bio_err,"Using configuration from %s\n",configfile);	if ((conf=CONF_load(NULL,configfile,&errorline)) == NULL)		{		if (errorline <= 0)			BIO_printf(bio_err,"error loading the config file '%s'\n",				configfile);		else			BIO_printf(bio_err,"error on line %ld of config file '%s'\n"				,errorline,configfile);		goto err;		}	/* Lets get the config section we are using */	if (section == NULL)		{		section=CONF_get_string(conf,BASE_SECTION,ENV_DEFAULT_CA);		if (section == NULL)			{			lookup_fail(BASE_SECTION,ENV_DEFAULT_CA);			goto err;			}		}	if (conf != NULL)		{		p=CONF_get_string(conf,NULL,"oid_file");		if (p != NULL)			{			BIO *oid_bio;			oid_bio=BIO_new_file(p,"r");			if (oid_bio == NULL) 				{				/*				BIO_printf(bio_err,"problems opening %s for extra oid's\n",p);				ERR_print_errors(bio_err);				*/				ERR_clear_error();				}			else				{				OBJ_create_objects(oid_bio);				BIO_free(oid_bio);				}			}		if(!add_oid_section(bio_err,conf)) 			{			ERR_print_errors(bio_err);			goto err;			}		}	randfile = CONF_get_string(conf, BASE_SECTION, "RANDFILE");	app_RAND_load_file(randfile, bio_err, 0);		in=BIO_new(BIO_s_file());	out=BIO_new(BIO_s_file());	Sout=BIO_new(BIO_s_file());	Cout=BIO_new(BIO_s_file());	if ((in == NULL) || (out == NULL) || (Sout == NULL) || (Cout == NULL))		{		ERR_print_errors(bio_err);		goto err;		}	/*****************************************************************/	/* we definitely need an public key, so lets get it */	if ((keyfile == NULL) && ((keyfile=CONF_get_string(conf,		section,ENV_PRIVATE_KEY)) == NULL))		{		lookup_fail(section,ENV_PRIVATE_KEY);		goto err;		}	if(!key && !app_passwd(bio_err, passargin, NULL, &key, NULL))		{		BIO_printf(bio_err,"Error getting password\n");		goto err;		}	if (BIO_read_filename(in,keyfile) <= 0)		{		perror(keyfile);		BIO_printf(bio_err,"trying to load CA private key\n");		goto err;		}		pkey=PEM_read_bio_PrivateKey(in,NULL,NULL,key);		if(key) OPENSSL_cleanse(key,strlen(key));	if (pkey == NULL)		{		BIO_printf(bio_err,"unable to load CA private key\n");		goto err;		}	/*****************************************************************/	/* we need a certificate */	if ((certfile == NULL) && ((certfile=CONF_get_string(conf,		section,ENV_CERTIFICATE)) == NULL))		{		lookup_fail(section,ENV_CERTIFICATE);		goto err;		}        if (BIO_read_filename(in,certfile) <= 0)		{		perror(certfile);		BIO_printf(bio_err,"trying to load CA certificate\n");		goto err;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -