Can't access peer/client certificate with Koa
Hi,

I read in another (closed) thread that it's possible to access the client certificate using Koa. I tried the solution in the other thread (below) however it doesn't work as I get the following error. If I can't get a solution I'll need to switch the Express as it's easy to access the peer certificate using the getPeerCertificate() call.

`No overload matches this call.
  Overload 1 of 4, '(name: string, path: string | RegExp, ...middleware: IMiddleware<any, {}>[]): Router<any, {}>', gave the following error.
    Argument of type '(ctx: IKoaContext, { const: c, console, log }: { const?: IKoaContext | undefined; console: any; log: any; }) => any' is not assignable to parameter of type 'string | RegExp'.
  Overload 2 of 4, '(path: string | RegExp | (string | RegExp)[], ...middleware: IMiddleware<any, {}>[]): Router<any, {}>', gave the following error.
    Argument of type '(ctx: IKoaContext, { const: c, console, log }: { const?: IKoaContext | undefined; console: any; log: any; }) => any' is not assignable to parameter of type 'IMiddleware<any, {}>'.
      Types of parameters 'ctx' and 'context' are incompatible.
        Type 'ParameterizedContext<any, IRouterParamContext<any, {}>, any>' is not assignable to type 'IKoaContext'.
          Types of property 'socket' are incompatible.
            Type 'Socket' is missing the following properties from type 'TLSSocket': authorized, authorizationError, encrypted, alpnProtocol, and 18 more.
  Overload 3 of 4, '(name: string, path: string | RegExp, middleware: Middleware<unknown, unknown, any>, routeHandler: IMiddleware<any, {}>): Router<any, {}>', gave the following error.
    Argument of type '(ctx: IKoaContext, { const: c, console, log }: { const?: IKoaContext | undefined; console: any; log: any; }) => any' is not assignable to parameter of type 'string | RegExp'.ts(2769)
`

Welcome @ilanl, I believe that the problem is from [@types/koa](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/koa/index.d.ts). 
So you need to do something like that:

```typescript
// the 1st solution: access from socket inside the koa context.
import * as Koa from 'koa'
import { TLSSocket } from 'tls'

const app = new Koa()

// the current Koa types use Socket from 'net' module 
// where 'getPeerCertificate' from 'tls' module.
interface IKoaContext extends Koa.Context {
  socket: TLSSocket
}

function middleware (ctx: IKoaContext, next: Koa.Next) {
  ctx.socket.getPeerCertificate()
}

// the 2nd solution: access from raw request inside the koa context or both.
import * as Koa from 'koa'
import { IncomingMessage } from 'http'
import { TLSSocket } from 'tls'

const app = new Koa()


interface RawRequest extends IncomingMessage {
  socket: TLSSocket
}

interface IKoaContext extends Koa.Context {
  socket: TLSSocket, // line 1
  req: RawRequest // line 2
}

function middleware (ctx: IKoaContext, next: Koa.Next) {
  ctx.socket.getPeerCertificate() // given from line 1
  ctx.req.socket.getPeerCertificate() // given from line 2
}
```

_Originally posted by @3imed-jaberi in https://github.com/koajs/koa/issues/1519#issuecomment-769231704_
            