Hello all im a newbie with a problem.

Im trying to run the example 10-5 (generate a
certificate request) from the code at
www.opensslbook.com (I enclose the code and my pivate
key).

However I get this error when I try to run the
program:

[EMAIL PROTECTED]:~$ gcc -o EX10-5 EX10-5.c -lssl
[EMAIL PROTECTED]:~$ ./EX10-5
** EX10-5.c:93 Error creating Name entry from NID
13831:error:0D11A0A3:asn1 encoding
routines:ASN1_mbstring_copy:string too
long:a_mbstr.c:154:maxsize=2

Is it something to do with this:

OBJ_txt2nid() or
X509_NAME_ENTRY_create_by_NID ()

???

any help appreciated as im having trouble working out
what this NID is and how it works.

Thanks

Oliver Foden

________________________________________________________________________
Want to chat instantly with your online friends?  Get the FREE Yahoo!
Messenger http://uk.messenger.yahoo.com/
#include <stdio.h>
#include <stdlib.h>
#include <openssl/ssl.h>
#include <openssl/x509.h>
#include <openssl/x509v3.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/rand.h>
#include <openssl/evp.h>
#include <openssl/objects.h>
/*
void seed_prng(void)
{
  RAND_load_file("/dev/urandom", 1024);
}*/

void
handle_error (const char *file, int lineno, const char *msg)
{
  fprintf (stderr, "** %s:%i %s\n", file, lineno, msg);
  ERR_print_errors_fp (stderr);
  exit (-1);
}

#define int_error(msg) handle_error(__FILE__, __LINE__, msg)

#define PKEY_FILE "privkey.pem"
#define REQ_FILE "newreq.pem"
#define ENTRY_COUNT 6

struct entry
{
  char *key;
  char *value;
};

struct entry entries[ENTRY_COUNT] = {
  {"countryName", "FINLAND"},
  {"stateOrProvinceName", "ESPOO"},
  {"localityName", "Tapiola"},
  {"organizationName", "xena.arcada.fi"},
  {"organizationalUnitName", "COMPTELE"},
  {"commonName", "CA"},
};

int
main (int argc, char *argv[])
{
  int i;
  X509_REQ *req;
  X509_NAME *subj;
  EVP_PKEY *pkey;
  EVP_MD *digest;
  FILE *fp;


  /*OpenSSL_add_all_algorithms ();*/
  ERR_load_crypto_strings ();
  /*seed_prng ();*/

/* first read in the private key */
  if (!(fp = fopen (PKEY_FILE, "r")))
    int_error ("Error reading private key file");
  if (!(pkey = PEM_read_PrivateKey (fp, NULL, NULL, "secret")))
    int_error ("Error reading private key in file");
  fclose (fp);

/* create a new request and add the key to it */
  if (!(req = X509_REQ_new ()))
    int_error ("Failed to create X509_REQ object");
  X509_REQ_set_pubkey (req, pkey);

/* assign the subject name */
  if (!(subj = X509_NAME_new ()))
    int_error ("Failed to create X509_NAME object");

  for (i = 0; i < ENTRY_COUNT; i++)
    {
      int nid;
      X509_NAME_ENTRY *ent;

/*OBJ_txt2nid() returns NID corresponding to text string <s>.
s can be a long name, a short name or
the numerical respresentation of an object.*/

    if ((nid = OBJ_txt2nid (entries[i].key)) == NID_undef)
        {
          fprintf (stderr, "Error finding NID for %s\n", entries[i].key);
          int_error ("Error on lookup");
        }
      if (!(ent = X509_NAME_ENTRY_create_by_NID (NULL, nid, MBSTRING_ASC,
                                                 entries[i].value, -1)))
        int_error ("Error creating Name entry from NID");
      if (X509_NAME_add_entry (subj, ent, -1, 0) != 1)
        int_error ("Error adding entry to Name");
    }
  if (X509_REQ_set_subject_name (req, subj) != 1)
    int_error ("Error adding subject to request");

/* add an extension for the FQDN we wish to have */
  {
    X509_EXTENSION *ext;
    STACK_OF (X509_EXTENSION) * extlist;
    char *name = "subjectAltName";
    char *value = "DNS:xena.arcada.fi";

    extlist = sk_X509_EXTENSION_new_null ();

    if (!(ext = X509V3_EXT_conf (NULL, NULL, name, value)))
      int_error ("Error creating subjectAltName extension");

    sk_X509_EXTENSION_push (extlist, ext);

    if (!X509_REQ_add_extensions (req, extlist))
      int_error ("Error adding subjectAltName to the request");
    sk_X509_EXTENSION_pop_free (extlist, X509_EXTENSION_free);
  }

/* pick the correct digest and sign the request */
  if (EVP_PKEY_type (pkey->type) == EVP_PKEY_DSA)
    digest = EVP_dss1 ();
  else if (EVP_PKEY_type (pkey->type) == EVP_PKEY_RSA)
    digest = EVP_sha1 ();
  else
    int_error ("Error checking public key for a valid digest");
  if (!(X509_REQ_sign (req, pkey, digest)))
    int_error ("Error signing request");

/* write the completed request */
  if (!(fp = fopen (REQ_FILE, "w")))
    int_error ("Error writing to request file");
  if (PEM_write_X509_REQ (fp, req) != 1)
    int_error ("Error while writing request");
  fclose (fp);

  EVP_PKEY_free (pkey);
  X509_REQ_free (req);
  return 0;
}
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQC9dpZK5ueAAWqBXlKiObXdZzepPW5h+4jumSsaymRUgxk4X9fo
71+f6hOpS0NHZ2Ney6pvIueE9CzZVfFbGrQutjQdJPLxKFHflOszjrQw86z9RLd/
r0QTsGCQ+3jXwntFW5Isl4JW+E9EWzrlVkbXYLNm+rannaGdOvY7toBfwQIDAQAB
AoGAIrbfwsmcETAxO5L0wRSh5fdLk47V8s4LwOv/oeEDkRiUPmgRP3TcqIhTIenQ
YfznkC7xA3v5v7qdnRTKLE8wRC2QlJ+4KUX3/+lvRbVtSnoe2C2NIiK/1pgvBS+J
82yl3n3BqWg5+Tf7fu6yUIbi0+ygNn5Pr3frdQ0PnSQ6AAECQQD3HBFnBe6PB2Or
tLV9ES+Nc6tOC7+1RmZFyuKgqlTfZVUOOfS0OLOheBrAP7Vai9H3wsYgaIeL+/su
yzVOkpOBAkEAxEeVXyq6qlGxQ3Po58mNb5N+YljeKrocGtEW7zTHplddNUsagzG6
1XX4cHynWETwReNt443J8rbsZceLsk7sQQJBANZ4zP3e3yPSpQZVjKOlM+GQgCD3
/4blOEThB3us+ob+GymC0clN4VKGvKkZYlzZN/7TVUSxlNvBc0w04Op2O4ECQQCo
KoSqEtv3jSKJHkgQPzl0vTPtYyKGDQqDV12E+P2NYRC01nISsYrX1MlU5xghon8S
AfdmnVbHIz6LPVpNHR2BAkEApXnvQUO39bBXlZfeUcUqzWBMOnNYY9SBoI2vmytk
xg28CkSv+gwAxdOquOR8jxmD0EjwH8nClmYkll20/PtzNw==
-----END RSA PRIVATE KEY-----

Reply via email to